Pull to refresh

Класс объектов или объекты класса?

Reading time5 min
Views15K
Устраиваясь на новую работу, я придумал новый вопрос для собеседования. Хочу задать его и вам.

Пусть у нас есть конкретная машина. КОНКРЕТНАЯ! Не тип и не класс машин, А именно конкретная машина, на которую я указываю своим указательным пальцем. Хозяин этой машины утверждает, что его машина состоит из множества компонентов, в том числе из колес. Он говорит, что его машина состоит из пяти колес (одно запасное). Замечу сразу, что хозяин говорит: «состоит из», а не «включает в себя».

Вопрос: слушая хозяина машины, что мы себе представляем: то, что машина состоит из колес одного класса?



Или то, что машина состоит из класса колес?




Комментарии к вопросу:
  • Под классом колес мы понимаем множество объектов. Не то, что понимается под этим термином в ООП (описание типа, модель объектов, описание общих признаков), нет. Мы понимаем просто набор каких-то объектов. То, что один из объектов имеет квадратную форму, нас не волнует. Хозяин сказал, что это колеса, — значит колеса.
  • Состоит из не значит, что состоит только из. Машина состоит много из чего. Все перечислять мы не будем. Но в том числе состоит из колес. Многие думают, что состоит из требует перечисления всех элементов конструкции, но это не так.
  • Состоит из — значит, что машина и то, с чем она связана связью «состоит из», связаны связью. Напомню, что термин «состоит из» имеет несколько смыслов:
  1. Композиция:
    1. Газ состоит из молекул, что означает связь между газом и классом молекул.
    2. Паззл состоит из пяти вот этих элементов. Состоит из в данном случае подразумевает пять связей «композиция» между паззлом и объектами класса «Элементы».
    3. Яблоня состоит из корней, ствола и кроны – обозначает три связи «композиция» между яблоней и каждым из перечисленных объектов.
  2. Агрегация: куча песка состоит из двух куч.
  3. Специализация: класс яблонь состоит из сортов яблонь. Это связь между множеством и его подмножеством.
  4. Классификация: класс машин состоит из машин. Это связь между классом объектов и объектами класса.

Запомним на будущее эти шесть различных трактовок термина «состоит из».

Однако, в нашем случае тезис «машина состоит из колес» может трактоваться лишь двумя способами: «машина состоит из класса колес» или «машина состоит из объектов класса «колеса».

Оба эти варианта определяют связь композиция. В философии считается, что сумма частей не может быть целым. Эта точка зрения называется холистической. Те, кто исповедуют обратное, называются редукционисты. В моделировании предметной области мы исповедуем принцип холизма и потому утверждаем, что машина не есть сумма ее компонент. И поэтому мы связываем машину с любым из ее компонент связью композиция.

Еще раз повторю вопрос: из чего состоит машина? Из класса колес? Или из колес класса?

Если мы задаем этот вопрос программистам, то они входят в ступор. В ООП нет моделей, связывающих объекты и классы. У программистов есть либо диаграммы классов, либо диаграммы взаимодействий. Но, чтобы на одной диаграмме были и классы и объекты – такого в UML нет. Поэтому возникает заминка в рассуждениях. Далее мне приходится еще раз напомнить, что под классом весь мир (кроме программистов) понимает множества объектов. И приходится напоминать, что класс в ООП не есть класс в реальном мире. Если слушатель это понимает, то он переходит к самой задаче. Если не понимает, то включает серию вопросов под общим флагом «А зачем нам это надо?» Предположим, что слушатель понял и вопрос, и тезисы и начал рассуждать. Сначала по инерции с ООП слушатель ищет классы. А у нас нет класса машин, а есть только одна машина. Слушатель пытается создать класс с единственным элементом, но это не спасает, потому что все равно я задаю крамольный с точки зрения ООП вопрос: может ли машина, а не класс машин быть связана с классом колес, а не с колесами класса? Шоу обеспечено.

Итак, ответ


Можно сказать, что машина состоит из класса колес, как двигатель состоит из класса болтов, как табуретка состоит из класса молекул. При этом мы не можем сказать, как именно машина состоит из колес, потому что в такой риторике нет координат, которые описывали бы местоположение колес в машине. В таком случае мы обычно говорим — машина состоит из пяти колес. Или — в работе участвуют пять плотников. Или — для строительства дома нужны кирпичи.

Однако, для описания местоположения каждого из колес можно использовать связь между машиной и колесами класса. Тогда мы получим пять связей «состоит из», которые свяжут машину и каждое из колес. Каждой такой связи мы можем приписать атрибут «местоположение», и значение этого атрибута выдаст нам местоположение данного колеса, например, «справа спереди». Понятно, что такие связи тоже образуют класс связей состоящий из пяти элементов. Тогда мы говорим: машина состоит из колес, (имея ввиду 5 связей), двигатель состоит из болтов (имея ввиду 100 связей) и табуретка состоит из молекул, (имея ввиду очень много связей). Например, звучать это будет так: машина состоит из следующих колес: правого переднего, правого заднего, левого переднего, левого заднего и запасного.

Есть те, кто использует упорядоченный класс колес для связи его с машиной. Каждому номеру в этом упорядоченном классе можно поставить координату месторасположения колеса. И тогда говорят, что можно связать машину с классом колес и при этом сохранить знание о месторасположении колес. Это неверно. Дело в том, что мы вводим еще один класс объектов – числа. Делаем связь между колесами и числами, каждое число связываем с машиной и связываем атрибут расположения колеса с цифрой. Так что в этом случае мы просто формируем связи между каждым колесом и машиной через значение атрибута (номер).
Итак, есть два способа построить конструкцию объекта. Сказать., что он состоит из объектов, или сказать, что он состоит из классов объектов. Эти два класса утверждений очень похожи друг на друга, но их надо различать.

Усложним вопрос


Теперь усложним ситуацию. Пусть теперь у нас есть класс машин. У каждой машины – класс колес, или колеса классов. Пусть верно, что любая машина состоит из 5 колес. Давайте посмотрим, какие объекты у нас уже есть:
  1. Объекты класса машин (машины). Количество таких объектов N.
  2. Класс машин. Мощность этого множества N.
  3. Объекты класса колес (колеса). Количество таких объектов 5*N.
  4. Класс колес. Мощность этого множества 5*N.
  5. Классы колес, принадлежащих одной машине. Количество таких объектов N.
  6. Класс классов колес, принадлежащих одной машине. Мощность этого множества N.
  7. Связи между машинами и колесами. Количество таких объектов 5*N.
  8. Класс связей между машинами и колесами. Мощность этого множества 5*N.
  9. Связи между машинами и классами колес, принадлежащих одной машине. Количество таких объектов N.
  10. Класс связей между машинами и классами колес, принадлежащих одной машине. Мощность этого множества N.
  11. Мы можем добавить новые связи:
  12. Класс машин можно связать с классом колес. Количество таких связей 1.
  13. Класс машин можно связать с классом классов колес, принадлежащих одной машине. Количество таких связей 1.
  14. Класс колес можно связать с колесами класса. Количество таких связей 5*N.

Каждый объект и каждая связь имеют семантическое значение. Например, класс машин обозначает объект, состоящий из множества машин. Класс классов колес, принадлежащих одной машине, обозначает наличие комплектов колес, каждый из которых (комплектов) принадлежит одной машине. Связь между классом машин и классом колес обозначает тезис: для изготовления партии машин нужна партия колес. И так далее. Умение из рассказа заказчика извлекать нужные сущности и моделировать их корректным образом и есть искусство аналитика. Вы можете продолжить тренироваться в нахождении семантики связей самостоятельно по указанной аналогии. Правда, некоторые связи будут весьма странными с точки зрения логики обывателя. Но это не исключает их невозможности.
Tags:
Hubs:
Total votes 40: ↑7 and ↓33-26
Comments147

Articles