آموزش و پیاده سازی معماری MVP در اندروید

معماری MVP در برنامه نویسی اندروید

معماری MVP چیست و پیاده سازی MVP در اندروید چگونه است؟

برای آموزش MVP در اندروید ابتدا باید بدانید معماری MVP چیست! الگوی (MVP (Model View Presenter از معماری شناخته شده (MVC (Model View Controller مشتق شده است و یکی از محبوب ترین الگوها برای سازماندهی لایه Presenter در برنامه های Android است. با ما همراه باشید تا با ذکر یک مثال شما را با پیاده سازی MVP در اندروید آشنا کنیم.

پیاده سازی MVP در اندروید : معماری MVP اجازه می دهد تا لایه Presenter از منطق جدا شود، به طوری که همه چیز در مورد نحوه عملکرد UI از نحوه نمایش آن بر روی صفحه نمایش جدا است. در حالت ایده آل ، الگوی MVP به این نتیجه می رسد که همان منطق ممکن است دارای دیدگاههای کاملاً متفاوت و قابل تعویض باشد.

اولین چیزی که باید روشن شود این است که MVP به خودی خود یک معماری نیست ، بلکه تنها مسئولیت لایه Presenter را بر عهده دارد. این یک ارزیابی بحث برانگیز بوده است ، بنابراین می خواهم آن را کمی عمیق تر توضیح دهم.

ممکن است متوجه شوید که MVP به عنوان یک الگوی معماری تعریف شده است زیرا می تواند بخشی از معماری برنامه شما باشد ، اما این را در نظر نگیرید که فقط به دلیل استفاده از MVP ، معماری شما کامل است. MVP فقط لایه Presenter را مدل می کند اما اگر می خواهید یک برنامه انعطاف پذیر و مقیاس پذیر داشته باشید ، بقیه لایه ها هنوز هم نیاز به یک معماری خوب دارند.

آموزش معماری mvvm اندروید - آموزش معماری mvvm در اندروید - آموزش برنامه نویسی اندروید پروژه محور - آموزش پروژه محور برنامه نویسی اندروید استودیو - آموزش MVP در اندروید

مزایای آموزش MVP در اندروید چیست و چرا باید از این معماری استفاده کنیم؟

  1. خیلی از شرکت ها برنامه نویسانی را استخدام می کنند که با پیاده سازی MVP در اندروید آشنایی داشته باشند و اگر در سبد آموزش برنامه نویسی اندروید خود این موضوع را یاد بگیرید، می توانید با خیلی از شرکت ها همکاری کنید که هم برای شما درآمد زایی دارد و هم شرکت ها می توانند از توانایی شما استفاده کنند.
  2. بعد از آموزش MVP در اندروید ، به عنوان مدیر پروژه براحتی می توانید بدون توضیحات اضافه کار گروهی راحتی با همکاران خود داشته باشید.
  3. بعد از اینکه پروژه خود را با معماری MVP نوشتید، براحتی می توانید آن را تغییر و آپدیت کنید
  4. با پیاده سازی MVP در اندروید در پروژه های بزرگ می توانید تست نویسی را راحت تر انجام دهید
  5. در Android مشکل ما ناشی از این واقعیت است که Activity های Android با مکانیزم های دسترسی UI و مکانیزم دسترسی به داده ها نزدیک است. ما می توانیم نمونه های افراطی مانند CursorAdapter را پیدا کنیم ، که آداپتورها را که بخشی از view هستند ، ترکیب کنند با cursors ، چیزی که باید به اعماق لایه دسترسی به داده ها منتقل شود.
  6.  برای اینکه یک برنامه به راحتی قابل توسعه و نگهداری باشد ، باید لایه های کاملاً جدا از هم تعریف کنیم. فردا چه کاری انجام میدهیم اگر به جای بازیابی همان داده ها از یک پایگاه داده ، بخواهیم آن را از یک سرویس وب دریافت کنیم؟ ما مجبوریم کل view های خود را دوباره از اول بسازیم.
  7.  معماری MVP در واقع لایه view را از منبع داده های ما مستقل می کند. ما برنامه را حداقل به سه لایه مختلف تقسیم می کنیم، که به ما امکان می دهد آنها را بطور مستقل تست کنیم. با MVP بیشتر منطق را از Activity خارج می کنیم تا بتوانیم بدون استفاده از تست های ابزار دقیق آن را آزمایش کنیم

ایجاد یک پروژه ساده برای درک بهتر پیاده سازی MVP در اندروید :

یک پروژه جدید در اندروید استودیو ایجاد میکنیم . نام لی اوت را به activity_login تغییر میدهیم . روت لی اوت را به LinearLayout تغییر داده و درون آن ۲ EditText و یک TextView به صورت زیر میگذاریم :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:gravity="center_vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".activities.LoginActivity">

    <EditText
        android:id="@+id/etUserName"
        android:layout_marginRight="25dp"
        android:layout_marginLeft="25dp"
        android:hint="Enter UserName ..."
        android:inputType="textPersonName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/etPassword"
        android:layout_marginTop="25dp"
        android:layout_marginRight="25dp"
        android:layout_marginLeft="25dp"
        android:hint="Enter Password ..."
        android:inputType="textPassword"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/tvLogin"
        android:padding="12dp"
        android:textSize="22sp"
        android:textColor="#fff"
        android:textStyle="bold"
        android:background="@color/colorPrimaryDark"
        android:text="LOGIN"
        android:gravity="center"
        android:layout_marginTop="25dp"
        android:layout_marginRight="25dp"
        android:layout_marginLeft="25dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

سه پکیج جدید با نام های model ، view و presenter در پروژه ایجاد میکنیم . یک پکیج دیگر به نام activities نیز ایجاد کرده. اکتیویتی اصلی را به LoginActivity تغییر نام داده و درون پکیج activities میگذاریم .حال باید ۲ اینترفیس در پکیج های view و presenter ایجاد کنیم . ابتدا روی پکیج view راست کلیک کرده ، New و سپس Java Class را میزنیم . نوع آنرا از Class به Interface تغییر می دهیم. نام این اینترفیس را LoginView گذاشته و ok را می زنیم تا اینترفیس ایجاد شود.

سپس روی پکیج presenter راست کلیک کرده، New و سپس Java Class را میزنیم . نوع آنرا از Class به Interface تغییر می دهیم. نام این اینترفیس را LoginPresenter گذاشته و ok را میزنیم تا اینترفیس دوم نیز ایجاد شود.

کد های اینترفیس LoginView به صورت زیر میباشد :

package com.elecomco.simplemvp.view;

public interface LoginView {
    void loginValidations();
    void loginSuccess();
    void loginError();
}

همانطور که مشاهده میکنید ۳ بدنه تابع در این اینترفیس ایجاد کرده ایم تا هنگام ارث بری از اینترفیس آنها را پیاده سازی کنیم .

یک بدنه تابع با نام preFormLogin در اینترفیس LoginPresenter ایجاد کرده که شامل ۲ ورودی از نوع رشته می باشد. در واقع می خواهیم یوزر نیم و پسورد در این اینترفیس گرفته شود. یا بهتر بگم ورودی ها رو از لایه Presenter دریافت می کنیم.

package com.elecomco.simplemvp.presenter;

public interface LoginPresenter {
    void preFormLogin(String userName,String password);
}

حالا یه کلاس می خوایم که از اینترفیس LoginPresenter ارث بری کنه (implements) ، و توابع اون رو پیاده سازی کنه. در پکیج model که در واقع نقش لایه مدل رو بازی می کنه، یه کلاس جدید با نام PresenterImpl میسازیم .کد های این کلاس به صورت زیر می باشد:

package com.elecomco.simplemvp.model;

import android.text.TextUtils;

import com.elecomco.simplemvp.presenter.LoginPresenter;
import com.elecomco.simplemvp.view.LoginView;

public class PresenterImpl implements LoginPresenter {

    LoginView mLoginView;

    public PresenterImpl(LoginView mLoginView) {
        this.mLoginView = mLoginView;
    }

    @Override
    public void preFormLogin(String userName, String password) {
        if(TextUtils.isEmpty(userName) || TextUtils.isEmpty(password)){
            mLoginView.loginValidations();
        }else {
            if(userName.equals("mohammad") && password.equals("123")){
                mLoginView.loginSuccess();
            }else {
                mLoginView.loginError();
            }
        }
    }
}

همانطور که مشاهده می کنید ورودی Constractor ما همان اینترفیسی هست که در لایه ویو ایجاد کرده ایم. یوزر نیم و پسورد را چک می کنیم. اگر مقدار آنها خالی بود تابع loginValidations فراخوانی می شود. اگر مقدار آنها برابر مقادیر دلخواه خودم بود تابع loginSuccess و اگر مقادیر وارد شده اشتباه بود ، تابع loginError فراخوانی می شود.

در اینجا کاملا اختیار از view گرفته شده است و اصلا نمیداند از کجا گرفته می شوند و به چه شکلی پیاده سازی می شوند. لایه مدل اطلاعات را از لایه Presenter دریافت می کند و view فقط یک شکل نمایشی دارد و دستورات اصلی را لایه Presenter ایجاد می کند و لایه View فقط اطاعت می کند.

حالا میرسیم به کدنویسی اکتیویتی :

package com.elecomco.simplemvp.activities;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.elecomco.simplemvp.R;
import com.elecomco.simplemvp.model.PresenterImpl;
import com.elecomco.simplemvp.presenter.LoginPresenter;
import com.elecomco.simplemvp.view.LoginView;

public class LoginActivity extends AppCompatActivity implements View.OnClickListener, LoginView {

    EditText etUserName,etPassword;
    TextView tvLogin;

    LoginPresenter mLoginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        etUserName=findViewById(R.id.etUserName);
        etPassword=findViewById(R.id.etPassword);

        tvLogin=findViewById(R.id.tvLogin);
        tvLogin.setOnClickListener(this);

        mLoginPresenter=new PresenterImpl(LoginActivity.this);

    }

    @Override
    public void onClick(View v) {
        String userName=etUserName.getText().toString();
        String password=etPassword.getText().toString();

        mLoginPresenter.preFormLogin(userName,password);

    }

    @Override
    public void loginValidations() {
        Toast.makeText(this, "Please Enter username and password!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginSuccess() {
        Toast.makeText(this, "Login Success!", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loginError() {
        Toast.makeText(this, "Login Failure!", Toast.LENGTH_SHORT).show();
    }
}

این ساده ترین پروژه ای بود که برای مفهوم معماری MVP در اندروید ایجاد کردیم. همینطور که می بینید محتوای ادیت تکست ها دیگه در لی اوت چک نمیشن، لی اوت ما دیگه اینجا هیچ کاره هست و فقط حالت نمایشی داره. کارهای اصلی رو لایه Presenter داره انجام میده . حالا اگه بخواین اکتیویتی رو به فرگمنت تبدیل کنید ، خیلی راحت و بدون اینکه در برنامتون تغییری ایجاد بشه ، این کار رو انجام میدین .

تو پروژه های بزرگ میتونید با معماری MVP آپدیت هاتون رو به راحتی و در کمترین زمان انجام بدین و نیاز نیست کل برنامتون رو از اول بنویسید . فرض کنید اینستاگرام بخواد یه آپشن جدید به اپلیکیشنش اضاف کنه ، اگر از ابتدا معماریش درست پیاده سازی نشه ، مجبوره خیلی از قسمتای برنامه نویسی رو پاک کنه و از اول به یه شکل دیگه بنویسه .

امروزه شرکت های بزرگ برای اسخدام برنامه نویس اندروید یکی از شرط هاشون تسلط برنامه نویس به معماری MVP هست. امیدواریم شما هم با اموزش معماری MVP در اندروید به یک برنامه نویس حرفه ای تبدیل شده باشید.

ما در دوره آموزش برنامه نویسی اندروید یه اپلیکیشن خبری رو با استفاده از این معماری پیاده سازی کردیم . امیدوارم که این آموزش براتون مفید و سودمند باشه . پیروز و سربلند باشید .

الکامکو می تواند به شما در یادگیری دوره های آموزش برنامه نویسی اندروید کمک کند تا شما را به یک برنامه نویس اندروید حرفه ای تبدیل کند.

در صورتیکه می خواهید یک اپلیکیشن اندرویدی برای کسب و کار خودتان یا مشتریان خود درست کنید پکیج آموزش برنامه نویسی اندروید با Android Studio  که در زیر میبینید را به شما پیشنهاد می کنیم.

دوره جامع آموزش برنامه نویسی اندروید برای ورود به بازار کار

برای اینکه شما عزیزان بتوانید برنامه نویسی اندروید را از صفر تا صد و پروژه محوری یاد بگیرید، این دوره حرفه ای را برای شما آماده کردیم که بتوانید با مشاهده این فیلم های آموزشی که هزینه خیلی کمی را نسبت به کلاس رفتن و وقت گرفتن از شما می گیرد، به یک برنامه نویس حرفه ای اندروید تبدیل شوید و بتوانید هر اپلیکیشن موبایل اندرویدی را بسازید و از انها کسب درآمد کنید و وارد بازار کار اندروید شوید.

قبل از خرید ارزیابی کنید، تعدادی از جلسات آن را به صورت رایگان برای شما در اینجا قرار دادیم تا بتوانید دانلود کنید.

شک نکنید بعد از دیدن این جلسات رایگان و کلا خرید این دوره، حتما دوره های دیگر ما را نیز خریداری خواهید کرد. چون مدرس این دوره، با حرفه ای ترین و جدیدترین روش ها، کاملترین مجموعه ساخت اپلیکیشن اندروید را برای شما تهیه کرده است و تجربه همکاری با شرکت گوگل را داشته است پس شکی در نحوه تدریس و کامل بودن پکیج نکنید و دوره را همین حالا خریداری کنید. 

آموزش اندروید استودیو - آموزش android studio - آموزش برنامه نویسی اندروید الکامکو - ساخت اپلیکیشن اندروید

commentشما بگید!

شما چه سوالی درباره این موضوع دارید که اینجا مطرح نشده است؟ لطفا تجربیات خودتان را در این زمینه حتما توی کامنت برای ما بنویسید. منتظر نظرات، پیشنهادات و سوالات شما در همین صفحه از سایت آموزش برنامه نویسی الکامکو هستیم…

توجه

مقاله هایی که در سایت به صورت رایگان قرار گرفته است فقط برای مطالعه بیشتر شما کاربران عزیز می باشد. از هرگونه تماس تلفنی با پشتیبانی سایت و سوال در مورد محتوای مقاله ها خودداری شود.

shareاشتراک گذاری این مطلب

shareآخرین مقالات

توجه

مقاله هایی که در سایت به صورت رایگان قرار گرفته است فقط برای مطالعه بیشتر شما کاربران عزیز می باشد. از هرگونه تماس تلفنی با پشتیبانی سایت و سوال در مورد محتوای مقاله ها خودداری شود.

Generic filters
Exact matches only

آخرین مقالات

آموزش های تکمیل شده

توجه

مقاله هایی که در سایت به صورت رایگان قرار گرفته است فقط برای مطالعه بیشتر شما کاربران عزیز می باشد. از هرگونه تماس تلفنی با پشتیبانی سایت و سوال در مورد محتوای مقاله ها خودداری شود.

4 دیدگاه
بازخورد درون خطی
مشاهده همه نظرات
سحر
2 سال گذشته

سلام.من دوره صفرتا صد و دیجی کالا رو گذروندم.الان بدجور ذهنم گیر کرده رو تفاوت mvc و mvp. لینک زیر این مثال شما رو بعنوان mvc مثال زده. مگه نه اینکه تو mvp لایه مدل باید از وجود view بی خبر باشه؟پس اینجا تو لایه مدل از اینترفیس loginview نمونه گرفته….ممنون میشم یکم راهنمایی کنید.دیجی کالا رو با mvc گفتید ولی من یکم گیج شدم…

پاسخ دادن به  سحر
2 سال گذشته

سلام.
جواب سوال شما رو نمیشه تو چند خط داد . خیلی گسترده هست بحث معماری ها . بعد از آموزش کاتلین دوره های ساخت اپلیکیشن فروشگاهی با معماری MVVM با جاوا و همچنین ساخت اپلیکیشن فروشگاهی با معماری MVVM با کاتلین و دوره ساخت اپلیکیشن خبری با معماری MVP با جاوا رو خواهیم داشت.

alireza
3 سال گذشته

سلام. با تشکر از این مطلب خوبتون . یه سوال داشتم. مهندس آزاد دوره MVP رو به صورت یک دوره آموزشی جداگانه هم آموزش میدن ؟

پاسخ دادن به  alireza
3 سال گذشته

سلام. بله. فعلا ۲ تا دوره در حال ضبط داریم. تموم بشه ۳ تا دوره دیگه برگزار میشه (آموزش حرفه ای ساخت پنل مدیریت ، آموزش حرفه ای معماری MVP ، آموزش حرفه ای معماری MVVM)