Я собираюсь использовать эту возможность, чтобы изложить ряд связанных, но разных мнений об объектно-ориентированной философии, в качестве своего рода запроса комментариев.Если администраторы сочтут нужным закрыть, я могу сделать это постом в блоге.Но я задаю вопросы, поэтому я думаю, что это подходящая вики сообщества.
Предположим, у меня есть abstract class Bird
.Предположим, что мы берем довольно типичную философию ОО *, Bird
- это объект, который способен поддерживать и изменять состояние.Очевидным примером состояния для этой простой модели является то, летит ли наш Bird
или нет.
Итак, Bird
имеет метод fly()
.
Или делает это??Я видел этот очень простой пример, приведенный во вводных книгах, и, на мой взгляд, он слегка вводит в заблуждение.Если вы поддерживаете состояние, вам не нужно указывать объекту продолжать оставаться в данном состоянии;это просто так.Это то, что делает объект.Поэтому на самом деле вы хотите, чтобы у Bird
был метод takeoff()
.
Предположим, в какой-то момент мы создали объект Bird
из другого класса, Egg
.В какой-то момент мы можем вызвать метод Egg.hatch()
, который имеет тип возврата Bird
.Предполагая, что мы кодируем интерфейс , Egg
знает, из какого типа птицы это яйцо, а возвращаемый экземпляр из hatch()
знает, что это за птица.Но мы не можем сказать, что между Egg
и Bird
есть что-то общее.действительно ли мы говорим, что мы хотим, чтобы конкретные реализации этих классов имели ссылку на экземпляр какого-то вида BirdArchetype
, который представляет характеристики всех экземпляров этого вида, чтобы и Egg
, и Bird
знали свои собственныедобрый, независимо, но последовательно?Существует ли какой-либо известный шаблон для такого рода отношений?
Чья ответственность за обеспечение того, чтобы Яйцо изменило состояние, чтобы оно больше не могло снова вылупиться или делать большинство других вещей, которые яйца обычно делают?do?
С философской точки зрения, хотим ли мы ввести концепцию разрушаемого объекта?Возможно, Egg
следует кодировать так, чтобы оно выдавало исключение, если вы пытаетесь сделать что-то из того, что меняет его состояние более одного раза.В вызывающем коде отслеживается жизненный цикл объекта клиента.
Что еще мы можем сделать с яйцом?Возможно, мы могли бы приготовить это.Если бы это был я, я бы закодировал это так, что вызов cook()
для яйца «разбивает» экземпляр Egg
и возвращает экземпляр нового объекта, FriedEgg
.Как это отличается от сообщения от Bird
до takeoff()
?Абсурдно предполагать, что взлет делает его принципиально другой птицей.Все же рассуждение то же самое;птица, которая летает (обычно), не может делать большинство других вещей, которые делают птицы, потому что она занята.Возможно, тогда Bird
можно сломать, так как пока он находится в состоянии полета, вызов некоторых других его методов не будет работать.
Полагаю, единственное реальное различие здесь в том, что Bird
может стать ип -broken.Действительно ли концепция термодинамической обратимости так важна для программирования очень простых моделей, подобных этой?