Мне нужно понять, как использовать дизайн стратегии в проекте PHP Project?
Примечание: это проект PHP
У меня есть ситуация, когда я использую 2 провайдера API для своего проекта. Они похожи на ту информацию, которую предоставляют (API). Я должен установить это правильно, потому что, возможно, завтра будет добавлено еще несколько API. Так что моему проекту потребуются некоторые методы. Базовый, вот что у меня есть:
abstract class A {}// first api class, mostly contains API configs and call
abstract class B {}// second api class, also mostly contains API configs and call
//than first API has a sub classes of something like cars and trucks
class Car extends A implements ApiMethodsInterface {} // for the cars
class Truck extends A implements ApiMethodsInterface {} // for the trucks
//now second API has a sub classes for cars , trucks and spaceships
class Car extends B implements ApiMethodsInterface {} // for the cars
class Truck extends B implements ApiMethodsInterface {} // the trucks
class SpaceShip extends B implements ApiMethodsInterface {} // for the space ships
//they all have more or less similar methods
// so i used an Interface that all above classes
interface ApiMethodsInterface
//methods are
public function getModels()
public function getYears()
public function getPrice()
поскольку каждый подкласс реализует этот интерфейс, я кодирую интерфейс
Теперь у меня есть ситуация, когда у SpaceShips есть больше методов для добавления, таких как getEquipment() и некоторая дополнительная информация, методы, которые не реализуются другими классами. У Trucks также есть больше методов, которые другие не реализуют, например hasTrailer(), трейлерLength() и т. Д.
Мой вопрос: что делать сейчас, следует ли использовать сегрегацию интерфейсов и добавлять интерфейсы к классам, реализующим эти методы, а затем проверять, имеет ли созданный объект этот метод, а не запускать, иначе какое-то исключение или добавить недостающие модели в абстрактный классы A и B и переопределить методы в классы, которые используют эти методы, или, может быть, есть еще более хороший способ решить эту проблему. Вполне новичок в шаблонах дизайна, кстати ...
Может быть, я слишком изобретаю, но я действительно хочу делать это в хорошем смысле.
Спасибо
1 ответ
Вероятно, это поможет вам нарисовать диаграмму, но мы можем обсудить ее.
Для разных разработчиков интерфейса совершенно нормально иметь методы, которых нет у других. Интерфейс определяет методы, общие для всех разработчиков, и когда вы кодируете интерфейс, вы просто вызываете эти методы, а не другие, которые может объявить класс. Любая реализация интерфейса может использоваться взаимозаменяемо с любой другой реализацией. Клиенту все равно, какие еще методы есть у разработчика, его интересует только использование методов интерфейса.
Но код, который не действует как клиент интерфейса, может рассматривать реализацию совершенно по-другому. Какой-то другой фрагмент кода может создать новый SpaceShip и вызвать getSpaceEquipment(). Это тоже нормально. Если вы создадите новый Truck, вы не сможете вызвать getSpaceEquipment(), потому что в этом классе нет этого метода.
Было бы ошибкой добавлять такие методы, как getSpaceEquipment(), к интерфейсу, реализуемому как Truck, так и SpaceShip, скажем, Vehicle. getSpaceEquipment() имеет смысл только для космического корабля, а не для всех транспортных средств.
Вы можете создать расширение Vehicle с именем SpaceVehicle и объявить в нем метод getSpaceEquipment(). Затем SpaceShip может реализовать SpaceVehicle (что делает его также транспортным средством по наследству). Но вы бы сделали это только в том случае, если бы у вас было несколько разработчиков SpaceVehicle, и вам нужно было написать код, который работает с экземплярами SpaceVehicle, но не заботится о том, является ли SpaceVehicle SpaceShip, Satelite или чем-то еще.