הבנת MVC ו-MVP באנדרואיד (Java)


מדריך למבנה שכבות נכון באפליקציות אנדרואיד

מבוא

לא השתכנעתי שניתן ללמד את זה בשלב זה ושזה לא יבלבל

כאשר מפתחים אפליקציה באנדרואיד, חשוב להפריד בין שכבות התצוגה (UI), הלוגיקה העסקית (Business Logic), והנתונים (Data). הפרדה זו מאפשרת תחזוקה קלה יותר, בדיקות אוטומטיות, ושימוש חוזר בקוד. שתי הארכיטקטורות הנפוצות לכך הן MVC ו-MVP.


🔷 MVC – Model View Controller

מבנה כללי

  • Model – אחראי על הנתונים, אחזורם, שמירתם ועיבודם (למשל דרך Firebase, SQLite, או API).
  • View – אחראית על הצגת הנתונים למשתמש (Activity, Fragment, Layout XML).
  • Controller – אחראי על הקישור בין ה-View ל-Model: מאזין לאירועים (כפתורים, אינפוטים), מפעיל לוגיקה ומעדכן את ה-View בהתאם.

דוגמה ב-Java

// Model
public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() { return name; }
    public int getAge() { return age; }
}

// Controller (Activity)
public class MainActivity extends AppCompatActivity {
    private TextView txtName;
    private User user;

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

        txtName = findViewById(R.id.txtName);
        user = new User("דנה", 25);
        txtName.setText(user.getName());
    }
}

במבנה זה, ה-Activity משמשת גם כ-Controller וגם כ-View, ולכן קשה לבדוק או להחליף שכבות בנפרד. מכאן נולדה גישת MVP.


🔶 MVP – Model View Presenter

עקרונות

ב-MVP מפרידים בצורה ברורה יותר את השכבות:

  • Model – אחראי על הנתונים (כמו ב-MVC).
  • View – ממשק (interface) שמגדיר מה ה-Presenter יכול לעשות עם התצוגה (כגון showUserName()).
  • Presenter – אחראי על הלוגיקה: מקבל בקשות מה-View, פונה ל-Model, ומחזיר תוצאה ל-View.

מבנה כללי באפליקציית Java

Activity (implements View) ↔ Presenter ↔ Model

דוגמה ב-Java

Model

public class UserModel {
    public User getUser() {
        return new User("דנה", 25);
    }
}

View (Interface)

public interface UserView {
    void showUserName(String name);
}

Presenter

public class UserPresenter {
    private UserView view;
    private UserModel model;

    public UserPresenter(UserView view) {
        this.view = view;
        this.model = new UserModel();
    }

    public void loadUser() {
        User user = model.getUser();
        view.showUserName(user.getName());
    }
}

Activity (ה-View בפועל)

public class MainActivity extends AppCompatActivity implements UserView {
    private TextView txtName;
    private UserPresenter presenter;

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

        txtName = findViewById(R.id.txtName);
        presenter = new UserPresenter(this);
        presenter.loadUser();
    }

    @Override
    public void showUserName(String name) {
        txtName.setText(name);
    }
}

⚖️ השוואה בין MVC ל-MVP

מאפיין MVC MVP
תפקיד Activity משמשת גם כ-View וגם כ-Controller מיישמת רק את ממשק ה-View
בדיקות אוטומטיות קשות לביצוע קלות יותר (Presenter ניתן לבדיקה בקלות)
תלות הדדית גבוהה בין שכבות מופרדת וברורה
תחזוקה קשה יחסית נוחה ותחזוקתית

💡 טיפ למעבר הדרגתי

אם יש לכם פרויקט קיים שבו ה-Activity מכילה לוגיקה עסקית, ניתן בהדרגה להעביר את הלוגיקה למחלקות Presenter מבלי לשנות את הממשק החיצוני. התחילו מהפרדת הממשק (interface) של ה-View.


🧩 מה הלאה

בעולם המודרני, גישות מתקדמות יותר כמו MVVM (Model-View-ViewModel) משולבות עם Jetpack Compose ו-LiveData. אך חשוב להבין קודם את הבסיס של MVC ו-MVP, שכן הן מציבות את עקרונות ההפרדה והמודולריות שבלעדיהם קשה לפתח אפליקציות בקנה מידה גדול.


📚 סיכום

  • MVC – מבנה פשוט אך מקשה על תחזוקה בפרויקטים גדולים.
  • MVP – מבנה מופרד היטב עם קלות בבדיקות ותחזוקה.
  • באנדרואיד מודרני מומלץ להתחיל מ-MVP לפני מעבר ל-MVVM.