Задать вопрос

Какой стиль ООП выбрать?

Приветствую всех.
Сразу оговорюсь, не уверен, что то о чем я спрашиваю называется именно стилем.
Ниже представлено 3 примера на PHP, меня интересует какая из реализаций класса для каких целей или в каком контексте предпочтительней, и является ли что-то из нижеперечисленного плохим/хорошим тоном?

$id = 1;

// пример 1
$class = new SomeClass();
$result = $class->setItem($id)->doSomething();

// пример 2
$class = new SomeClass();
$result = $class->doSomething($id);

// пример 3
$class = new SomeClass($id);
$result = $class->doSomething();
  • Вопрос задан
  • 800 просмотров
Подписаться 5 Простой 4 комментария
Решения вопроса 1
@synapse_people
пример 2 и только
Обьясню
Например, SomeClass - сервис логгирования.
Тогда сделаем ему интерфейс, создадим 2 подтипа - логер на файлах и в БД.
Итого 1 интерфейс, 2 класса реализации.
Параметры метода описаны в интерфейсе..
Вот и имеем, что метод будет вызван с конкретным аргументом...
В других случаях не понятно поведение подклассов, которые будут это реализовать.. А именно в плане того, что должен делать setItem в 1 случае, и ессно интерфейсы не могут описывать конструкторы как в примере 3...
В итое имеем, что можно легко заменить объект другим объектом ТОЛЬКО в примере 2.
Насчет геттеров - имхо, лучше создавать приватные свойства и геттер+сеттер
Т.к. на больших проектах чаще всего получается лапша, да и в плане многопоточности, и опять же-интерфейсов -просто свойства не есть хорошо...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@egormmm
Борітеся — поборете!
1. Похож на "рецепт приготовления пирога". Чтобы испечь пирог - сделай а,б,в, .... и положи в печь.
Минусы: вам нужно знать рецепт, какие ингредиенты могут быть, в какой последовательности их класть, и т.д. Это потребует изучение мануалов.

2. Можно использовать, если параметр метода - это некоторое "уточнение" для метода, а не его зависимость.

3. Я использую этот. Небольшие классы, легко тестировать и расширять. В конструкторе необходимо указать тип для параметра. Тогда приготовление пирога сводится к предоставлению определенных зависимостей, и самого процесса "выпечки" (вызова метода).
Ответ написан
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Вообще забудьте о дополнительном слове get -- это излишество.

1) Всё ок, метод setItem чисто теоретически может возвращать и только что добавленный айтем, тут все зависит от того, как класс используется. Я не знаю можно ли так пхп, но метод может в принципе возвращать и this или ссылку сам на себя. Что может быть использовано для реализации патерна билдер, например.

2) Плохо. Класс должен возврашать хранимый айтем, знать об его внутреннем представлении о каких-то его методах или полях ему совсем не нужно. Вернули айтем, потом у него и спрашивайте данные.

3) Третий пример я не понял. Да, в целом у класса есть какие-то данные, то да, он может их вернуть. Это не проблема.

PS То, о чём вы спрашиваете, называется OOD. К языку программирования это имеет немного отношения.
PPS В следующий раз, задавайте вопросы по какой-нибудь более конкретной модели. Пара-тройка простеньких классов, описывающих, ну там, книжную полку, напрмиер, на которую можно поставить книгу и забрать. Ваш пример слишком абстрактный.
Ответ написан
Комментировать
@nozzy
Symfony, Laravel, SQL, Python, Telegram
Пример 1 - такой подход позволяет сократить количество строк кода.
Ответ написан
Ваш ответ на вопрос

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

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