Класс объектов или объекты класса?
Устраиваясь на новую работу, я придумал новый вопрос для собеседования. Хочу задать его и вам.
Пусть у нас есть конкретная машина. КОНКРЕТНАЯ! Не тип и не класс машин, А именно конкретная машина, на которую я указываю своим указательным пальцем. Хозяин этой машины утверждает, что его машина состоит из множества компонентов, в том числе из колес. Он говорит, что его машина состоит из пяти колес (одно запасное). Замечу сразу, что хозяин говорит: «состоит из», а не «включает в себя».
Вопрос: слушая хозяина машины, что мы себе представляем: то, что машина состоит из колес одного класса?
Или то, что машина состоит из класса колес?
- Под классом колес мы понимаем множество объектов. Не то, что понимается под этим термином в ООП (описание типа, модель объектов, описание общих признаков), нет. Мы понимаем просто набор каких-то объектов. То, что один из объектов имеет квадратную форму, нас не волнует. Хозяин сказал, что это колеса, — значит колеса.
- Состоит из не значит, что состоит только из. Машина состоит много из чего. Все перечислять мы не будем. Но в том числе состоит из колес. Многие думают, что состоит из требует перечисления всех элементов конструкции, но это не так.
- Состоит из — значит, что машина и то, с чем она связана связью «состоит из», связаны связью. Напомню, что термин «состоит из» имеет несколько смыслов:
- Композиция:
- Газ состоит из молекул, что означает связь между газом и классом молекул.
- Паззл состоит из пяти вот этих элементов. Состоит из в данном случае подразумевает пять связей «композиция» между паззлом и объектами класса «Элементы».
- Яблоня состоит из корней, ствола и кроны – обозначает три связи «композиция» между яблоней и каждым из перечисленных объектов.
Однако, в нашем случае тезис «машина состоит из колес» может трактоваться лишь двумя способами: «машина состоит из класса колес» или «машина состоит из объектов класса «колеса».
Оба эти варианта определяют связь композиция. В философии считается, что сумма частей не может быть целым. Эта точка зрения называется холистической. Те, кто исповедуют обратное, называются редукционисты. В моделировании предметной области мы исповедуем принцип холизма и потому утверждаем, что машина не есть сумма ее компонент. И поэтому мы связываем машину с любым из ее компонент связью композиция.
Еще раз повторю вопрос: из чего состоит машина? Из класса колес? Или из колес класса?
Если мы задаем этот вопрос программистам, то они входят в ступор. В ООП нет моделей, связывающих объекты и классы. У программистов есть либо диаграммы классов, либо диаграммы взаимодействий. Но, чтобы на одной диаграмме были и классы и объекты – такого в UML нет. Поэтому возникает заминка в рассуждениях. Далее мне приходится еще раз напомнить, что под классом весь мир (кроме программистов) понимает множества объектов. И приходится напоминать, что класс в ООП не есть класс в реальном мире. Если слушатель это понимает, то он переходит к самой задаче. Если не понимает, то включает серию вопросов под общим флагом «А зачем нам это надо?» Предположим, что слушатель понял и вопрос, и тезисы и начал рассуждать. Сначала по инерции с ООП слушатель ищет классы. А у нас нет класса машин, а есть только одна машина. Слушатель пытается создать класс с единственным элементом, но это не спасает, потому что все равно я задаю крамольный с точки зрения ООП вопрос: может ли машина, а не класс машин быть связана с классом колес, а не с колесами класса? Шоу обеспечено.
Итак, ответМожно сказать, что машина состоит из класса колес, как двигатель состоит из класса болтов, как табуретка состоит из класса молекул. При этом мы не можем сказать, как именно машина состоит из колес, потому что в такой риторике нет координат, которые описывали бы местоположение колес в машине. В таком случае мы обычно говорим — машина состоит из пяти колес. Или — в работе участвуют пять плотников. Или — для строительства дома нужны кирпичи.
Однако, для описания местоположения каждого из колес можно использовать связь между машиной и колесами класса. Тогда мы получим пять связей «состоит из», которые свяжут машину и каждое из колес. Каждой такой связи мы можем приписать атрибут «местоположение», и значение этого атрибута выдаст нам местоположение данного колеса, например, «справа спереди». Понятно, что такие связи тоже образуют класс связей состоящий из пяти элементов. Тогда мы говорим: машина состоит из колес, (имея ввиду 5 связей), двигатель состоит из болтов (имея ввиду 100 связей) и табуретка состоит из молекул, (имея ввиду очень много связей). Например, звучать это будет так: машина состоит из следующих колес: правого переднего, правого заднего, левого переднего, левого заднего и запасного.
Есть те, кто использует упорядоченный класс колес для связи его с машиной. Каждому номеру в этом упорядоченном классе можно поставить координату месторасположения колеса. И тогда говорят, что можно связать машину с классом колес и при этом сохранить знание о месторасположении колес. Это неверно. Дело в том, что мы вводим еще один класс объектов – числа. Делаем связь между колесами и числами, каждое число связываем с машиной и связываем атрибут расположения колеса с цифрой. Так что в этом случае мы просто формируем связи между каждым колесом и машиной через значение атрибута (номер). Итак, есть два способа построить конструкцию объекта. Сказать., что он состоит из объектов, или сказать, что он состоит из классов объектов. Эти два класса утверждений очень похожи друг на друга, но их надо различать.