Skip to content

MVP praktika

Atabek M edited this page Mar 10, 2018 · 6 revisions

MVP haqqinda biraz bolsada xabarıńız bar degen úmittemiz, eger bolmasa onda mına jerde úyreniwińizge boladı.

Endi alǵan bilimlerimizdi real praktikada sınap kórsek maqsetke muwapıq bolar edi. Házirgi kúnde derlik barlıq web-sayt ham mobil baǵdarlamalarda login, yaǵnıy kiriw funkciyası bar. Usı salıstırmalı ápiwayı háreketti biz androidta MVP járdeminde baǵdarlamalastırıp kóreyik.

Login ushın MVP

Login funkciyasın MVP járdeminde qosqanımızda shama menen tómendegishe qatlamlarǵa bólinedi:

androidmvp 001

Kórip turǵanińızday, shep jaqta View qatlamı jaylasqan hám ol LoginActivity hám LoginViewlerdi óz ishine alǵan. Ortada Presenter qatlamı - bizlerdiń eń tiykarǵi baylanıstırıwshı buwınımız, onı LoginPresenter arqalı kórsetilgen. Hám aqırǵısı bul Model, bizlerdiń maǵlıwmatlar menen islesiw qatlamımız, ol LoginRepository arqalı sáwlelendirilgen. Tómende hár bir qatlamdı tolıqraq qarap shıǵamız.

View

Eger itibar bergen bolsańız, View qatlamında eki fayl bar: LoginActivity hám LoginView. Endi soraw tuwıladi, bizge usı eki fayl shártpe, tek LoginActivitydiń jetkilikli emespe? Ulıwma funkcional tárepten qarasaq LoginActivity barlıq bizge kerek jumıstı ózi-aq atqarıwı múmkin. Biraq LoginViewge itibarımızdı qaratayıq, onıń quramı tómendegishe:

public interface LoginView {
    void showUsernameError(int error);
    void hideUsernameError();
    void showPasswordError(int error);
    void hidePasswordError();
    void goToResultScreen(int userId);
}

Javáda interfeyslerde tek metodlardiń atları kórsetiledi, olardiń klasslardan parqı metodlardıń implementaciyası berilmeydi. Interfeysler ádette kelisim yáki shártnama rólin oynaydi. Bizlerdiń mısalda, Presenterdiń konstruktorına usı LoginViewdi implement qılgan obyektti beriwimiz kerek, presenterge parqı joq qaysi klass ol interfeysti implement qılıwı. Sebebi qaysı klass bolsada, interfeyste kórsetilgen barlıq metodlar ol klassta boladı.

Aldın aytqanımızday, bizlerdiń View qatlamımızda hesh qanday logika bolmawı hám tek UIǵa baylanıslı háreketler menen shuǵillanıwı kerek. LoginViewǵa itibar bergen bolsańiz, bul metodlar barlıǵi presenterden shaqırılatuǵin metodlar. Yaǵniy presenter kerekli ámellerdi qılıp bolıp, UIda neni ózgertiw kerekligin sheshedi hám kerekli metodlardı shaqıradı. Máselen showUsernameError metodin paydalanıwshı atı natuwrı berilgeninde shaqıradı.

// Presenter mınanday jaratıladı
LoginPresenter presenter = new LoginPresenter(this, UserRepository.getInstance()); // bul jerde this dep LoginView názerde tutılmaqta

// Knopka basılǵanda presenterdi shaqıramız
presenter.login(username.getText().toString(), password.getText().toString());

Presenter

Presenterde ilaji barinsha tek taza java klasslar boliwi kerek, yaǵniy ilaji bolǵaninsha Androidqa tiyisli klasslardı (Context, Activity, Fragment, ...) qospaǵan maqul. Buǵan bas sebep, eger taza java klass bolsa, oni unit test qıliw ańsat hám tez boladi. Presenter bul proekttiń logikasın óz ishine alatuǵin bolǵanı ushın, onı test qılıw maqsetke muwapıq boladı. Basqa qatlamlardı test qılıw shárt bolmasada, biraq presenterge imkaniyat bolsa test jaziw kerek.

Presenterdiń metodları ádette View qatlamınan shaqırıladı. Onnan keyin, Presenter jaratilǵanda oǵan kerek bolǵan barlıq obyektlerdi konstruktor arqali beriw kerek. Bul test qılıw ushın júdá áhmiyetli, bul haqqında keleshekte test haqqında maqalada ele toqtap ótemiz.

// Presenterdiń bir metodınan mısal
public void login(String username, String password) {
    if (!validate(username, password)) return;

    // Bul jerde login natiyjesin **Model** qatlamindaǵı UserRepository'dan sorap atırmız
    int loginResult = repository.login(username, password);

    // juwabın alǵannan soń, nátiyjege qarap **View** qatlamındaǵı kerekli metodti shaqıramız
    if (loginResult == User.USER_NOT_FOUND) {
        view.showPasswordError(R.string.username_password_not_match);
    } else {
        view.goToResultScreen(loginResult);
    }
}

Model

Model qatlamında ádette model (POJO - Plain Old Java Object) klasslar hámde sol modeller menen islesetuǵin klasslar boladı. Bizlerdiń ápiwayı mısalımızda User model klassi hám UserRepository klassı bar. UserRepository real dunyada maǵliwmatlar bazasınan yaki tarmaq arqalı API'lar menen baylanisip, maǵliwmatlardı alıwǵa juwap beredi.

public int login(String username, String password) {
    // bul jerde userList lokal jaratilǵan maǵlıwmat, onin ornina maglıwmatlar bazası yaki tarmaq API bolıwıda múmkin
    for (User user : userList) {
        if (username.equals(user.getUsername()) && password.equals(user.getPassword())) {
            return user.getId();
        }
    }

    return User.USER_NOT_FOUND;
}

Clone this wiki locally