2009-06-09 2 views
0

У меня есть класс, представляющий строку в таблице. Я хочу добавить функцию, которая управляет данными в строке. Где я должен добавить функцию?Где мой метод go

1) внутри класса, потому что он связан с классом 2) вне класса в отдельном классе-помощнике?

В прошлом я всегда бы выбрал номер 1. Я начинаю думать, что номер 2 - лучший ответ, потому что он отделяет логику от своего собственного инкапсулированного класса и снижает сложность класса данных. Я думаю, что класс данных должен быть как можно более открытым и просто содержать членов данных, абсолютно не имеющих логики.

Что является самым проворным/лучшим способом для этого?

ответ

2

Принцип единой ответственности сформулирован как «Для изменения объекта должна быть только одна причина». С вашим вариантом 1 есть две причины, по которым объект может измениться: вы можете изменить, какие данные хранятся в объекте, или вы можете перейти на другую систему баз данных (например, mySQL на PostgrSQL).

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

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

+1

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

+0

И иногда вы * будете * менять системы баз данных, когда не ожидали (произошли с нами). Но это то, о чем вы должны обратиться только тогда, когда вам нужно - это не стоит нести всю сложность, если вам это еще не нужно. –

3

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

2

В чистом смысле MVC номер 2 - ваш лучший выбор. Создайте модель данных и оставьте ее свободной от всей логики реализации. Это позволит вам потенциально повторно использовать модель для всех приложений. Затем контроллер может содержать логику реализации приложения, которая управляет данными.

0

Зависит от того, что функция. Точка класса - это инкапсуляция функций и данных, как правило.

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

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

1

Правильный ответ «это зависит»; «манипулировать данными в строке» может быть оправдано либо ответ.

С точки зрения разделения проблем вам необходимо определить, какую абстракцию выполняет эта функция. Является ли это абстракцией строки в базе данных? Поместите его в этот класс. Является ли объект в вашей модели данных реализованным в терминах строки в базе данных? Поместите его в этот класс.

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

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