Должен ли я инкапсулировать метод обновления внутри объекта или иметь метод, который принимает объект для обновления? - PullRequest
1 голос
/ 02 января 2011

У меня на самом деле есть 2 вопроса, связанных друг с другом:

  1. У меня есть объект (класс), который называется, скажем, MyClass, который содержит данные из моей базы данных.В настоящее время у меня есть список этих объектов (List ), который находится в синглтоне в «коммунальной области».Я чувствую, что легче управлять данными таким образом, и я не вижу, как передача класса от объекта к объекту выгодна по сравнению с одиночным (я был бы рад, если бы кто-то мог сказать мне, почему).В любом случае, данные могут изменяться в базе данных за пределами моей программы, поэтому мне приходится обновлять данные очень часто.Чтобы обновить список MyClass, у меня есть метод с именем say, Update, написанный в другом классе, который принимает список MyClass.Это обновляет все экземпляры MyClass в списке.

    Однако было бы лучше вместо этого инкапсулировать метод Update () внутри объекта MyClass, поэтому вместо этого я бы сказал:

    foreach(MyClass obj in MyClassList) {
        obj.update();
    }
    

    Что является лучшей реализацией и почему?

  2. Для метода обновления требуется средство чтения XML.Я написал класс для чтения XML, который по сути является оберткой над стандартным средством чтения XML, которое обеспечивает родной язык и обеспечивает сбор данных для конкретного приложения.Если класс читателя XML в любом случае находится в «пути наследования» объекта MyClass - объекты MyClass наследуются от читателя XML, поскольку он использует несколько методов.Я не понимаю, почему это так.Мне не нравится идея объявления экземпляра класса XML Reader внутри MyClass, а объект MyClass должен быть простой «записью» из базы данных, и я чувствую, что он дает ему множество методов, другие экземпляры объекта немногобеспорядочный.Возможно, мой класс чтения XML должен быть статическим, но родной для C # XMLReader не является статичным?

Будем благодарны за любые комментарии.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2011
  1. Не включайте Update () в класс. Я знаю, что это кажется заманчивым, потому что это обновление называется «проще», но что бы это создавало зависимости. (Предположительно) MyClass содержит данные БД, потому что это объект домена, который представляет состояние некоторой реальной единицы измерения (материальной, концептуальной или иной). Если вы включаете метод update (); теперь ваш доменный объект отвечает не только за представление состояния некоторой логической «вещи», но и за логику персистентности (сохранение, загрузка, новое, удаление). Вам лучше создать сервис, который будет выполнять эти обязанности. Это относится к конструктивному принципу высокой когезии, т.е. каждый класс имеет только 1 ответственность (или тип ответственности по крайней мере). например .... persistenceService.saveUser (myUser);

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

Подумайте об этом, когда пытаетесь принимать проектные решения ... планируйте изменения (нестабильность, хаос или как бы вы это ни называли). Что если через месяц вам нужно отключить постоянство XML для базы данных? Или что если вам вдруг придется иметь дело с MyClassVariantA, MyClassVariantB, MyClassVariantC? Минимизируя зависимости, когда вам нужно что-то изменить, это не потребует каскада изменений во всех остальных частях вашего приложения.

0 голосов
/ 02 января 2011

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

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

Ваш второй вопрос звучит так, как будто MyClass содержит данные из базы данных, что делает его объектом-сущностью. Объекты Entity не должны содержать бизнес-логику, поэтому я думаю, что все будет в порядке, если класс Service использует XMLReader для выполнения операций с данными, а затем использует методы получения / установки для манипулирования данными в объекте. То же, что и раньше, имеет то преимущество, что ваш код свободно связан и более удобен в обслуживании.

...