2014-01-30 3 views
1

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

Мой вопрос: Является ли это хорошей практикой или лучше отделить логику и структуру от начала, если есть разумный потенциал, который изменит бизнес-логика?

Мой интуитивный инстинкт состоит в том, чтобы сохранить логику отдельно, поскольку это, по-видимому, следует принципу открытого/закрытого, а сочетание структуры и логики, по-видимому, нарушает SRP.

+0

С другой стороны, вы, вероятно, чтобы построить структуры данных, которые содержат * нет * своей логику? И, см. Также [YAGNI] (http://en.wikipedia.org/wiki/You_aren't_gonna_need_it) –

+0

@Damien_The_Unbeliever Единственная логика, которая должна содержать (и должна) структура данных, связана с тем, как хранить и запрашивать общие данные , – delnan

+0

@ delnan - хорошо, так что это отказ от всего объектно-ориентированного подхода. Я не говорю, что это неправильно, просто это еще не обязательно. –

ответ

2

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

В таких случаях, как списки, очереди и словари в объектно-ориентированных языках, данные и логика объединяются для формирования сплоченного объекта и взаимозависимы. В этих случаях разделение логики и данных на самом деле не имеет смысла в объектно-ориентированном языке, таком как C#.

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

Итак, я думаю, что короткий ответ: это действительно зависит от того, что вы делаете.

Надеется, что это помогает, Nate

+0

Согласовано о списках и т. Д. Я думаю, что я пытаюсь спросить по строкам ... Если мне нужно преобразовать из типа Foo в тип List, я бы не стал расширять List, чтобы потреблять Foo в качестве нового List (Foo) или List.Add (Foo). Я бы сделал метод или интерфейс, которые обрабатывали перевод и вернули список. Аналогично для базы данных у меня может быть класс, позволяющий добавлять, удалять, создавать и т. Д., Но логика для взятия необработанных данных и помещения их в базу данных будет отдельной, используя метод Add() базы данных. Это правильно? И есть ли времена, когда правильно сочетать эти два? – Josh

+0

@ Josh, опять же это зависит. В случае с базой данных я, как правило, согласен с вами и не совмещаю структуру данных с кодом базы данных, поскольку она представляет собой довольно сильное разделение проблем. Тем не менее, существует очень популярный шаблон под названием ActiveRecord (см. Http://en.wikipedia.org/wiki/Active_record и http: //www.castleproject.org/projects/activerecord/для деталей), который объединяет что-то вроде вашей базы данных .Add() метод с структурой данных. – NateTheGreat