прям начал замечать, что в последнее время стараюсь избегать слова extend
Для себя считаю данный совет самым лучшим https://stackoverflow.com/a/53354/474290 Есть два типа TypeA и TypeB 1) Если в TypeB требуется предоставить уже готовый интерфейс TypeA или ожидается что TypeB будет использован вместо TypeA - тогда выбираем наследование 2) Если TypeB требуется только часть интерфейса TypeA - выбираем композицию
Если не делать наследования реализации, то потом это очень сильно окупается: код становится расширяемым и подменяемым, реже ломается, стабильнее и понятнее работает. Особенно это заметно, когда требуется поменять поведение внешних зависимостей, так как мы не отвественны за их реализацию и она может в любой момент поменяться. Поэтому если новый класс не относится к семейству, например, им нельзя подменить другие классы по идеологическим причинам, или имеет отличный интерфейс или расширяет реализацию, или дополняет поведение, то тут однозначно композиция. Наследование хорошо применять от абстракции, когда мы реализуем семейство классов. Этим мы говорим, что новый класс относится ко всему семейству абстрактного класса и можем подставлять его вместо всех существующих.
Я пишу SDK для HTTP API. Реализую функционал постинга. В частности, можно запостить альбом из фотографий, а можно просто просто фотографию. Для того, что бы осуществить постинг, необходимо сначала аплоаднуть файлы, а потом уже делать запрос на создание поста. Загрузка файла происходит по одному эндпоинту, но с разными параметрами для альбома и для сингл поста. Соответственно, есть сущности Photo и AlbumPhoto. Должны ли они расширять базовый класс, типа UploadablePhoto, либо же они должны принимать его в качестве зависимости?
Тут хорошо подойдет интерфейс Uploadable, который будут реализовывать все сущности. Если сервис Upload будет принимать интерфейс Uploadable, тогда в него можно будет передать любой подобный объект. А Uploadable будет возвращать необходимые метаданные. Все, конечно, зависит от идеологии существующего API, но я бы сделал так
Да, это звучит как идеальное решение, спасибо!
Обсуждают сегодня