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 передав соответствующие параметры. Но это не ООП, да и не красиво это смотрится. Я надеюсь у меня нет ошибок в понимании паттерна (если есть, пожалуйста, жду...). Прав ли я? Если нет (что в полне вероятно), то покажите, пожалуйста, правильный подход.
В вашем примере действительно есть некоторые нарушения принципов MVC. В данном случае класс Human играет роль общедоступной сущности, которая известна как модели, так и представлению. Это приводит к сильной зависимости между моделью и представлением, что нарушает принцип разделения ответственностей в паттерне MVC.
Для решения данной проблемы, обычно используются DTO (Data Transfer Objects) или Value Objects. Это специальные классы, которые содержат только данные и не имеют логики, они используются для передачи данных между моделью и представлением.
Таким образом, ваш пример может быть изменен следующим образом:
Создайте класс HumanDTO, который содержит только данные о человеке, без какой-либо логики:public class HumanDTO { int id; String name; Date birthday; // getters and setters }В модели, используйте HumanDTO для передачи данных:public class Model { public HumanDTO[] getHumans() { /* тут куда-то лезет и что-то отдаёт в виде HumanDTO */ } public HumanDTO getHumanById(int id) { /* тут тоже */ } }В представлении, используйте HumanDTO для отображения данных:public class View { public void showHumans(HumanDTO[] humans) { /* тут как-то отображает */ } }
Таким образом, вы избавитесь от прямой зависимости между моделью и представлением, соблюдая принципы MVC.
В вашем примере действительно есть некоторые нарушения принципов MVC. В данном случае класс Human играет роль общедоступной сущности, которая известна как модели, так и представлению. Это приводит к сильной зависимости между моделью и представлением, что нарушает принцип разделения ответственностей в паттерне MVC.
Для решения данной проблемы, обычно используются DTO (Data Transfer Objects) или Value Objects. Это специальные классы, которые содержат только данные и не имеют логики, они используются для передачи данных между моделью и представлением.
Таким образом, ваш пример может быть изменен следующим образом:
Создайте класс HumanDTO, который содержит только данные о человеке, без какой-либо логики:public class HumanDTO {int id;
String name;
Date birthday;
// getters and setters
}В модели, используйте HumanDTO для передачи данных:public class Model {
public HumanDTO[] getHumans() { /* тут куда-то лезет и что-то отдаёт в виде HumanDTO */ }
public HumanDTO getHumanById(int id) { /* тут тоже */ }
}В представлении, используйте HumanDTO для отображения данных:public class View {
public void showHumans(HumanDTO[] humans) { /* тут как-то отображает */ }
}
Таким образом, вы избавитесь от прямой зависимости между моделью и представлением, соблюдая принципы MVC.