@kofon
Я человек

MVC. Может ли быть что-нибудь общедоступным?

В кач-ве языка путь будет Java, т.к. сейчас я разрабатываю mob. app.

По фантазируем...
Пусть есть некая сущность, Человек:
public class Human {
  int id;
  String name;
  Date birthday;
  // getters and setters
}


Дальше, есть модель, которая лезет куда-нибудь, и достаёт данные о людях.
public class Model {
  public Human[] getHumans() {   /* тут куда-то лезет и что-то отдаёт */  }
  public Human getHumanById(int id) {   /* тут тоже */  }
}


И ещё есть вьюха, которая отображает список людей:
public class View {
   public void showHumans(Human[] humans) { /* тут как-то отображает */ }
}


И соответственно контроллер, который из одного берёт, в другое отдаёт, описывать я его не буду, итак ясно.

Вроде хорошо, но тут, по моему (не уверен) рушится принцип MVC, т.к. тот самый класс Human знают все, от модели до представления. Если верить литературе, различным статьям и т.д., то тут что-то не верно, т.к. всё связанно с неким классом (Human). Но лично мне кажется такой подход нормальным, т.к. если Human'у добавится новое поле, то так или иначе придётся исправлять модель и представление (ведь теперь, это новое, нужно доставать (Model) и также показывать пользователю (View)).

Можно, как вариант, брать данные как строку из модели (или массив строк), парсить, вызывать методы View передав соответствующие параметры. Но это не ООП, да и не красиво это смотрится.

Я надеюсь у меня нет ошибок в понимании паттерна (если есть, пожалуйста, жду...).
Прав ли я? Если нет (что в полне вероятно), то покажите, пожалуйста, правильный подход.
  • Вопрос задан
  • 777 просмотров
Решения вопроса 2
Ewintory
@Ewintory
Java / Android developer
Ничего не рушится, Human это сущность (POJO). В MVC она может участвовать во всех 3х частях. А может и не участвовать, если например на уровне Model вы оперируете одними сущностями, а в View передаете другие, например составные.

Можно, как вариант, брать данные как строку из модели (или массив строк), парсить, вызывать методы View передав соответствующие параметры. Но это не ООП, да и не красиво это смотрится.
ООП это не только MVC а вообще подход в программировании. Помимо MVC еще есть MVP, MVVM и др.
Ответ написан
@veitmen
Ошибка в понимании есть. Вы класс Human рассматриваете как одну из частей MVC. Это не совсем так, Human, это как раз и есть те данные, которые отображает VIew, процессит контроллер и извлекает модель. Если вы поменяете данные, то ведь нужно изменить отображение, обработку и то, как они достаются. От этого никуда не денешься и в этом нет ничего страшного. НА текущий момент изменение структуры данных, не так страшно, как было раньше. Технологии позволяют генерировать как БД, так и модели, контроллеры и вьюхи, не делая это руками. Но не стоит злоупотреблять, все должно быть в меру. А то помню, как на одном проекте пытались генерить по модели абсолютно все что только можно, начиная от БД, заканчивая скриптами на клиенте. Ад получался.

В целом да, о данных с которым идет работа знают все слои MVC. Иначе бы непонятно было бы, что делать, что отображать и т.д. Также советую рассматривать Human, как DTO, это так называемый Data Transfer Object, объект, который транспортирует данные, как некая посылка. Вы даже не рушите объектного подхода при использовании DTO, как некоторые думают.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@FoxInSox
Используйте интерфейс вместо конкретного класса если вам так покажется лучше:
public interface IHuman{
  String getName();
  void setName(String name);
}

Так же и представление оберните в интерфейс, т.к. в клиентской разработке UI зачастую это самая сложная и постоянно развивающаяся составляющая.

ps а вообще не забивайте сильно себе голову паттернами поначалу. Они лучше всего понимаются на практике, и не на "рассказанной кем-то" практике, а на вашей собственной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы