2012-06-16 3 views
11

В Scala есть два инструмента для выражения композиции объекта: оригинальная концепция самонаведения и известная тривиальная композиция. Я любопытно, в каких ситуациях я должен использовать, что.Как отличить композицию и самонастраивающиеся прецеденты

Существуют очевидные различия в их применимости. Самостоятельный тип требует использования признаков. Состав объекта позволяет изменять расширения во время выполнения с объявлением var.

Оставляя технические детали позади, я могу изобразить два индикатора, чтобы помочь в классификации вариантов использования. Если какой-либо объект используется как комбинатор для сложной структуры, такой как дерево, или просто имеет несколько аналогичных типизированных частей (соотношение между 1 автомобилем и 4 колесами), то он должен использовать композицию. Существует крайний противоположный случай использования. Предположим, что одна черта становится слишком большой, чтобы четко ее наблюдать, и она раскололась. Вполне естественно, что для этого случая вы должны использовать типы автотипов.

Эти правила не являются абсолютными. Вы можете сделать дополнительную работу для преобразования кода между этими методами. например вы можете заменить 4 состава колес на самонабор по продукту4. Вы можете использовать Cake[T <: MyType] {part : MyType} вместо Cake { this : MyType => } для зависимостей шаблона торта. Но оба случая кажутся противоречивыми и дают вам дополнительную работу.

Существует множество случаев использования границ. Отношения «один-к-одному» очень сложно решить. Есть ли какое-то простое правило, чтобы решить, какая техника предпочтительнее?

self-type делает классы абстрактными, состав делает ваш код подробным. самонадеянность дает вам проблемы с смешиванием пространств имен, а также дает вам дополнительную набирать бесплатно (у вас есть не просто коктейль из двух элементов, а бензиновый моторный коктейль, известный как бензиновая бомба).

Как я могу выбрать между ними? Какие намеки есть?

Update:

Рассмотрим следующий пример:

шаблон Adapter. Какие преимущества у него есть как при наборе текста, так и в составлении?

+0

Он выглядит как будто вы покрыли большую часть компромиссов. Я бы добавил, что композиция, вероятно, будет более знакома для менее квалифицированных команд. Вы можете принять это как повод использовать композицию ** или ** причину, чтобы препятствовать ее использованию в пограничных случаях, которые вы отмечаете, чтобы поощрять обучение и рост.При прочих равных условиях я, как правило, придерживаюсь самостоятельной типизации только для подробностей. Боюсь, мне не очень помогает, поэтому это комментарий, а не ответ. Отличный вопрос. –

+0

Вы нашли удовлетворительный ответ? – Optimight

+0

У меня есть философские ответы без технической точности, которые следует использовать в компьютерной науке *. Может ли сам вопрос неуместным? – ayvango

ответ

3

Подсказки ниже основаны на эвристическом подходе (метод проб и ошибок решения проблем, когда алгоритмический подход является нецелесообразным) и не поддерживается какой-либо формулой (математическое обоснование).

*** Подсказки, данные здесь, должны оцениваться с учетом сопроводительных намеков, никакая подсказка не является идеальным правилом для различения состава и самонастраивающихся прецедентов.

(Следуя нижеуказанным намеков, я не забочусь или сосредоточиться на многословие или количество линий кода или программирования усилий входов.)

композиция (словарное значение): акт объединения частей или элементов образуют единое целое (Trivial композиция)

черты (словарь смысл): отличительная характеристика или качество

Советов по Trivial состава (которое может быть достигнуто с помощью супер - подклассы механизма или отношений ассоциации) (например, Автомобиль и колеса):

  • Который может учитываться дискретно (напр.Колеса)

  • Что можно классифицировать futher (на основе различных критериев) (например, колеса - литые диски, стальные колеса и т.д.)

  • , которые могут быть добавлены или удалены. (Примечание: Когда мы говорим, колесо остановилось, на самом деле скорость вращения колеса остановлена, когда мы говорим, что сердце остановилось, на самом деле пульсирующая скорость сердца стала нулевой)

  • обычно применим к немногим (во вселенной Некоторые транспортные средства и некоторые механизмы имеют колеса) (несколько могут быть 10-15 или миллионами. - Объяснить, давайте понять это утверждение: когда геолог говорит о времени и говорит некоторое время назад, это означает, что несколько миллионов лет назад, это зависит от конкретного объекта)

Подсказки для самостоятельного типа (Тр) (например. Автомобиль и скорость):

  • Что одномерным (не с точки зрения физики), могут быть нанесены на числовой прямой (независимо от физического блок) (например, скорость)

  • Который не может (например, скорость) (или, по крайней мере, вы не будете классифицировать ее дальше). Здесь, естественно, слово, используемое для обозначения значения, которое следует классифицировать, должно зависеть от ваших собственных критериев, и будет определенная возможность его классифицировать в миллионы подтипов. Возьмите движение, у вас могут быть миллионы движущихся объектов ... как зигзагообразный ход, поворот и движение вперед, ... (миллионная возможность с разной комбинацией перестановок).

  • который может быть увеличен или уменьшен или купирован (например, скорость, гнев, любовь и т.д.)

  • Который обычно рассматривается/можно увидеть в очень отдаленном размещенных классах (например, скорость света, скорость земля, скорость бегуна)

  • вообще применимо ко многим (во вселенной большинства (здесь каждый) объект имеет скорость)

    Software Development, как сделать свою собственную вселенную, и как создатель вы определяете все. Титма будет видна среди дистанционно расположенных классов в вашем домене (ваша собственная вселенная).

Пожалуйста, обратите внимание, что я не видел какого-либо конкретного слова (здесь партнерское для признака) на любом языке (я знаю очень мало) для части, которая используется для тривиальных композиции.

Далее Пояснение:

Чтобы получить ответ, Вам нужно найти где-то глубоко в философии ориентированного класса или объектно-ориентированного aporach разработки программного обеспечения и должны понимать разум и логику создателей языков программирования таких как java и scala (или многие другие), которые внедряли ориентированную на классы или объектно-ориентированную парадигму в пределах этого языка.

Другая необходимость - глубокое понимание семантики (изучение смысла или изучение лингвистического развития путем классификации и изучения изменений в значении и форме), которые мы используем для описания реального мира и семантики ключевых слов (на языке программирования) мы используем в качестве программистов.

Я считаю, что когда мы создаем класс, мы хотим воплотить реальный мир в программное обеспечение.Класс становится представителем чего-то из реального мира, может быть, это автомобиль, человек, звезда, мечта, мысли или воображение и т. Д.

Когда кто-то скажет «Колеса», у вас будет четкое изображение его формы и приложения, и вы могут думать о ведущем колесе или колесах, которые катятся по дороге. Колесо всегда будет частью чего-то. Его можно пересчитать по дискретным числам. Колеса могут быть дополнительно классифицированы на основе критериев, таких как материал, приложение, размер и т. Д. Колесо подобный вещи подходит для тривиальной композиции.

Когда кто-то скажет «Скорость», у вас не будет четкой картины изображения ... нет формы ... нет цвета ... но вы можете связать ее с какой-либо движущейся (относительной) частью во вселенной. Это характерная черта. Скорость не является частью чего-либо. Он может быть там, или он не может быть там. Он может быть нанесен на одну строку (в любом направлении + или -). Трудно классифицировать «Скорость». Скорость, как вещи, подходит для достижения цели.

На мой взгляд,

Если взять автомобиль в качестве класса (Object), «Скорость», как характеристики должны идти, как черта в Скале. И «Колесо», как части, компоненты должны входить как «Тривиальная композиция». Характеристики «скорости» не будут иметь естественной классификации, где «Колеса» могут иметь много классов, и они сами являются независимыми объектами (на самом деле).

Если мы возьмем Человека как класс (Oject), «Гнев, плач, смех и т. Д.», как поведение должно идти как черта и «руки, ноги, мозг, сердце и т. д.» должны входить как «Тривиальная композиция», поскольку они сами являются независимыми объектами (в действительности).

Если мы думаем о названии, это может быть дано чему угодно и любому, т.е. наша ближайшая звезда имеет имя «Солнце», самая высокая гора имеет имя «Гималаи», моя собака имеет название «Роки», река имя «Амазонка» .... «Имя» является признаком и не следует рассматривать для «Тривиальной композиции».

Если мы думаем о сердце, у животных есть сердце как их часть. Его следует рассматривать для «Тривиальной композиции», а не как признака.

Что такое класс?

Класс - это описание или синяя печать конкретного объекта.

Что такое объект?

Объект - это реальность, которая может быть описана определением класса.

(Яйцо или курица? Кто пришел первым?) Я считаю, что инженер-программист сначала думает об объектах, а затем (чтобы описать их или сделать их) (из плана) определяет класс. (Обратите внимание, что в объектно-ориентированном моделировании и дизайне - класс и объект дополняют существование друг друга.) («Яйцо или курица? Кто пришел первым?» Для сосуществования класса и объекта и не имеет никакого отношения к знаменитому Кругу-Затмению Проблема (http://en.wikipedia.org/wiki/Circle-ellipse_problem), как позже связано с наследованием или подтипа полиморфизма)

интерфейс:. вещь, которая позволяет отдельно и иногда несовместимые элементы для эффективной координации

Разработка программного обеспечения походит на создание вашей собственной вселенной, и как создатель вы определяете все. Композиция должна быть предпочтительной по сравнению с наследованием. (Банда из четырех шаблонов дизайна)

+0

. Точка, «которую можно классифицировать дальше», работает и для самонабора. например мы используем подвижность и вычитания признаков, которые определяют движение спуска, движение вихря и т. д. – ayvango

+0

возможность остановить гораздо больше для композиции, чем самонастраивающийся. часть вас не может перестать работать (так как человек не может жить с остановленным сердцем). – ayvango

+0

есть большая разница в отношениях между родителями и родителями. Если родительский элемент, встроенный в две части через композицию с методами size(), он может вычислять общий размер как max (a.size(), b.size()) или a.size() + b.size() и так далее. Если этот случай покрыт самонастраивающимся, все части равны и должны использовать узор с уложенными чертами – ayvango

Смежные вопросы