Как к объектам проектирования?

Это - определенно хороший способ сделать это. Но Вы, если Вы, оказывается, используете базу данных, которая поддерживает LINQ к SQL, это может быть намного больше забавы. Это может выглядеть примерно так:

MyDB db = new MyDB("Data Source=...");
var q = from db.MyTable
        select c;
foreach (var c in q)
  Console.WriteLine(c.MyField.ToString());
6
задан Sakamoto Kazuma 23 November 2009 в 03:44
поделиться

7 ответов

Ну, первое Вы должны понять, что OOAD («Объектно-ориентированный анализ и дизайн») - это инструмент, а не средство для достижения цели. В результате вы получаете модель, а не истинное представление того, что вы моделируете. Эта модель делает определенные предположения. Цель этой модели - решить вашу проблему.

Итак, как вы знаете, как проектировать объекты? Как узнать, правильно ли вы сделали? По конечному результату: решило ли это вашу проблему?

Итак, в примере с автомобилем в некоторых моделях количество автомобилей может быть просто целым числом, например, движение автомобилей через перекресток в модели движения. В такой модели редко когда вы заботитесь о марке, модели или конструкции машин, а только о количестве. Вы можете заботиться о типе транспортного средства, будь то грузовик или легковой автомобиль (например). Вы моделируете это как объект типа «Автомобиль» с типом «Автомобиль» или «Грузовик»? Или просто разделите счетчики carCount и truckCount?

Краткий ответ: какой из них работает лучше всего.

Обычный тест на то, является ли что-то объектом или нет, - имеет ли это поведение? Помните, что в конечном итоге объекты = данные + поведение.

Таким образом, можно сказать, что автомобили имеют следующие состояния:

  • колес;

  • Высота подвески;
  • Левый или правый привод;
  • Цвет;
  • Ширина;
  • Вес;
  • Длина;
  • Высота;
  • дверей;

  • Есть ли у него люк на крыше;
  • Есть ли в нем стереосистема, CD-плеер, MP3-плеер и / или спутниковая навигация;
  • Размер бензобака;
  • Количество цилиндров;
  • турбонаддува и / или впрыска топлива;

  • Максимальный крутящий момент;
  • Максимальная тормозная мощность;
  • и т. Д.

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

Это поднимает второй вопрос об объектах. : объект может существовать из-за такой связи, что объект представляет полный набор данных. Таким образом, колесо может иметь протектор, ширину, температуру и так далее. Вы можете' Разделите это на части и скажите, что у Автомобиля есть протектор, но нет ширины колеса, так что Колесо имеет смысл быть объектом, поскольку Колесо в целом взаимозаменяемо.

Но опять же, имеет ли это смысл для того, что вы делаете? Это ключевой вопрос.

7
ответ дан 8 December 2019 в 16:04
поделиться

Не начинайте с классификации вещей - похоже, люди слишком стремятся начать построение иерархий наследования.

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

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

Определите, что каждая роль »

Вот несколько рекомендаций, которые я придумал, чтобы помочь с этим:

Что должно быть в контрольном списке, чтобы помочь кому-то разработать хорошее объектно-ориентированное программное обеспечение?

5
ответ дан 8 December 2019 в 16:04
поделиться

Мне нравится Responsibility-Driven Design (RDD) Wirfs-Brock, а также рекомендую этот обновленный (бесплатный документ) Responsibility-Driven Modeling подход Алистера Кокберн.

За более чем 15 лет объектно-ориентированной разработки всякий раз, когда я чувствовал, что теряюсь в архитектуре программного обеспечения, возвращение к основам RDD всегда помогает мне прояснить, что программное обеспечение должно делать и как.

Если вам нравится подход, основанный на тестировании, эта статья показывает, как связать RDD с имитацией объектов и тестов.

1
ответ дан 8 December 2019 в 16:04
поделиться

Grow your classes bottom-up.

1) Class boundaries and semantics depend on context. Until you have a context, you don't have anything. (You may not even have a car in your example). Context is given by the user story (or use case).

2) Throw all the state and behavior suggested by the given context into one class (you could name this after the user story if you would like).

3) Use systematic Refactoring to tease this class apart into separate classes. While refactoring, use existing classes as reuse opportunities.

When you're done, you'll have a set of well-defined classes that are just enough to fulfill the needs of the given user story (and the user stories that came before).

0
ответ дан 8 December 2019 в 16:04
поделиться

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

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

0
ответ дан 8 December 2019 в 16:04
поделиться

Атрибуты или переменные часто являются «базовыми» типами языка. Вопрос в том, что вы можете разумно абстрагировать.

Например, вы можете сократить Wheel до дескрипторов, состоящих из базовых типов, таких как целые числа, значения с плавающей запятой и строки, которые представляют характерные атрибуты любого колеса : numberOfTreads , диаметр , ширина , рекомендуемое давление , марка . Все эти атрибуты могут быть выражены с помощью базовых типов для создания объекта Wheel .

Можете ли вы сгруппировать некоторые из этих атрибутов в более абстрактную структуру, которую можно использовать повторно, независимо от Wheel ]? Я думаю так. Возможно, создайте объект Размеры с атрибутами диаметр и ширина . Тогда ваше колесо имеет связанный с ним экземпляр объекта Размеры вместо диаметра и ширины . Но вы можете подумать об использовании этого объекта Dimensions с другими объектами, которые не обязательно могут быть экземплярами Wheel .

Поднимаясь вверх по списку, вы можете уменьшить Car должен состоять из базовых типов, а также из других объектов, таких как объекты Wheel . Это разумно, потому что другие моторные и немоторные транспортные средства (например, Велосипед ) также содержат экземпляры Wheel .

Абстрагирование Колесо и Измерения позволяет повторно использовать эти типы объектов в различных контекстах, которые вы изначально не можете рассматривать. Это немного облегчает вашу жизнь, потому что теоретически вам нужно переписывать меньше кода.

Если вы можете создать иерархию объектов до такой степени, что самый глубокий объект нижнего уровня состоит только из нескольких базовых типов , это, вероятно, хорошее место для начала.

0
ответ дан 8 December 2019 в 16:04
поделиться

Здесь есть несколько хороших ответов, но, возможно, больше, чем вы искали. Чтобы кратко ответить на ваши конкретные вопросы:

  • Как мне узнать, когда сделать автомобиль объектом или колесо автомобиля объектом, если обе программные структуры достигли бы цели?

    Когда вам нужно различать один экземпляр от другого, то вам нужен предмет. Ключевым отличием объекта является то, что он имеет идентичность.

    Если распространить этот ответ на классы, когда поведение и / или свойства двух похожих объектов расходятся, вам понадобится новый класс.

    Итак, если вы При моделировании имитации движения с подсчетом колес может быть достаточно класса Vehicle со свойством NumberOfWheels. Если вы моделируете гоночную симуляцию с подробным описанием поверхности дороги и физики крутящего момента колес, каждое колесо, вероятно, должно быть независимым объектом.

  • Как мне классифицировать и классифицировать части объекта, чтобы определить, являются ли они лучше подходят как простые атрибуты или переменные объекта, или если они действительно должны быть самим объектом?

    Ключевые различия - это идентичность и поведение. Часть с уникальным существованием - это объект. Деталь с автономным поведением требует своего собственного класса.

    Например, если вы создаете очень простую симуляцию автокатастрофы, NumberOfPassengers и DamageResistance могут быть достаточными свойствами универсального класса Vehicle. Этого было бы достаточно, чтобы сказать вам, была ли машина разбита, а пассажиры выжили. Если ваше моделирование более детализировано, возможно, вы хотите узнать, как далеко каждый пассажир был отброшен при лобовом столкновении, тогда вам понадобится класс Passenger и отдельные объекты Passenger в каждом Транспортном средстве.

2
ответ дан 8 December 2019 в 16:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: