На этом шаге рассмотрим природу объектов.
Основными конструктивными элементами в объектно-ориентированном анализе и проектировании сложных систем программного обеспечения являются классы и объекты. Поскольку в предыдущих шагах приведено лишь неформальное определение этих двух элементов, настало время подробно изучить природу классов и объектов, взаимоотношения между ними, а также сформулировать несколько эмпирических правил проектирования качественных абстракций и механизмов.
Способностью распознавать физические объекты человек овладевает с самого раннего возраста. Ярко окрашенный мяч привлекает внимание младенца, но, если спрятать мяч, ребенок, как правило, не пытается его искать: как только предмет покидает его поле зрения, он перестает существовать для него. Только в возрасте около года у ребенка появляется понятие о предмете (object concept): навык, чрезвычайно важный для развития его познавательных способностей в будущем. Покажите мяч годовалому ребенку и спрячьте его: скорее всего, ребенок начнет поиски, даже не видя мяча. Следовательно, ребенок осознает, что объект обладает постоянством и отличительными особенностями независимо от действий, выполняемых над этим предметом [Lefrancois, G. 1977. Of Children: An Introduction to Child Development. Second Edition. Belmont, CA: Wadsworth, p. 244-246. ].
Неформально, объект был определен как материальная сущность, демонстрирующая четко определенное поведение. С точки зрения познавательных способностей человека, объектом может быть одна из следующих сущностей:
Таким образом, неформальное определение объекта дополняется идеей о том, что объект является частью реального мира и, следовательно, существует во времени и пространстве. В программировании термин объект впервые был применен в языке Simula и применялся для моделирования определенных аспектов реальности [Nygaard, K., and Dahl, O-J. 1981. The Development of the Simula Languages. In History of Programming Languages. New York, NY: Academic Press, p. 462.].
Объекты реального мира — не единственная разновидность объектов, представляющих интерес при проектировании систем программного обеспечения. На этапе проектирования возникают и другие важные типы объектов, взаимодействие между которыми лежит в основе механизмов, реализующих более сложное поведение [Halbert, D., and O'Brien, R September 1988. Using Types and Inheritance in Object-Oriented Programming. IEEE Software vol. 4(5), p. 73.].
Якобсон (Jucobson) и соавторы дали следующее определение управляющих объектов (control objects) - это объекты, объединяющие в одно целое потоки событий и обеспечивающие связь между другими объектами [Jacobson, I., Christerson, M., Jonsson, P., and Overgaard, G. 1992. Object-Oriented Software Engineering: A Use Case Driven Approach, Reading, MA: Addison-Wesley, p. 186.].
Более точное определение сформулировано Смитом (Smith) и Токи (Tockey) - объект представляет собой конкретный идентифицируемый предмет, элемент или сущность, реальную или абстрактную, играющий четко определенную роль в данной предметной области [Smith, M., and Tockey, S. 1988. An Integrated Approach to Software Requirements Definition Using Objects. Seattle, WA: Boeing Commercial Airplane Support Division, p. 132.].
Совершенно очевидно, что некоторые сущности объектами не являются. К их числу относятся, например, атрибуты, такие как красота или цвет, а также эмоции, например, любовь или гнев. С другой стороны, потенциально все перечисленные сущности являются свойствами объектов. Например, можно говорить о том, что некий человек (объект) любит яблоко (другой объект), или что конкретный пес (еще один объект) имеет черный окрас.
Таким образом, объект — это нечто, имеющее четко определенные границы, но этого недостаточно, чтобы отделить один объект от другого или судить о качестве абстракции. Таким образом, можно дать следующее эмпирическое определение объекта. Объект обладает состоянием, поведением и индивидуальностью. Структура и поведение схожих объектов определяется в общем для них классе. Термины экземпляр и объект являются синонимами.
На следующем шаге рассмотрим понятие состояния объекта.