Объектно-ориентированное программирование - лучшая практика? - PullRequest
0 голосов
/ 23 апреля 2011

Что из следующего вы бы выбрали?А на основе объектно-ориентированного программирования какая из них является лучшей практикой?

A

Class Note
{
    //Some properties, etc
    public static Note getNoteFromServer();
    public void UpdateNoteOnServer();
}

B

Class Note
{
    //Some properties, etc
}

Class NoteManager
{
    public static Note getNoteFromServer();
    public static UpdateNoteOnServer(Note);
}

Ответы [ 10 ]

4 голосов
/ 23 апреля 2011

Я бы сказал вариант Б. Таким образом, вы разделяете проблемы: у вас есть Note, который можно использовать где угодно (и не обязательно в сетевом приложении), и у вас есть класс менеджера, который заботится только о взаимодействии с сервером.

Вы также можете подумать о логике реализации для нескольких серверов. Например, вы можете захотеть общаться с такими форматами данных, как JSON или XML. Вы можете реализовать интерфейс (например, интерфейс INoteManager), а затем реализовать два класса с серверами для каждого из типов данных, которые я упомянул (например, NoteManagerXml и NoteManagerJson).

Основным вопросом в этом вопросе является разделение проблем. Надеюсь, я помог! :)

3 голосов
/ 23 апреля 2011

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

Если класс отвечает за сохранение заметки, назовите его NoteRepository.

Если он отвечает за проверку содержания отдельной заметки, переместите логику на Note.

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

И если он отвечает за все вышеперечисленное, разделите его на отдельные части, потому что он делает слишком много.

1 голос
/ 14 июля 2012

Кажется, это зависит от того, как он будет использоваться в вашей программе. Если Note является единственным классом или является родительским классом для производных классов, тогда нет смысла и иметь «Менеджера», Keep It Simple Stupid (KISS). Однако, если Менеджеру приходится иметь дело с другими классами через Интерфейсы, я вижу наличие отдельного класса.

1 голос
/ 25 апреля 2011

Я думаю, что А лучше по одной причине:

Он реализует объектно-ориентированный парадигма к письму.

Проблема, которую я вижу с B, состоит в том, что статический метод, который получает экземпляр того же класса, звучит для меня избыточно, потому что, почему вы используете статический метод, чтобы применить поведение к экземпляру того же класса? Основная идея классов и экземпляров состоит в том, что классы - это фреймы и куки-файлы экземпляров, если вам нужны разные куки-файлы, измените ваш фрейм и получите новые.

1 голос
/ 23 апреля 2011

Это довольно симпатичный вопрос, который вы задаете там.

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

Это действительно зависит. Если мы планируем использовать среду MVC, лучше подойдет Пример B, где Note будет моделью, а NoteManager - контроллером.

Лично я бы пошел с гибридом A и B, где NoteManager обрабатывает действия контроллера, но у Модели все еще есть свои собственные методы для таких вещей, как управление одноэлементным экземпляром. Так может быть что-то подобное?

Class Note
{
    //Some properties, etc
    public static Note getInstance(noteIdentifier);

    public void saveNote();
}

Class NoteManager
{
    // This handles view validation and calls Note.saveNote();
    public static UpdateNoteOnServer(Note);
}
0 голосов
/ 11 января 2014

C

Class Note
{
    //Some properties, etc
    public static Note LoadFrom(Whatever);
    public void SaveTo(Whatever);
}
0 голосов
/ 23 апреля 2011

"Это зависит"

Одна из вещей, от которых это зависит, - это язык реализации.

Если вы работаете в C # или Java, вы, вероятно, захотите пойти сподход Note / NoteManager, так как это дает вам наибольшую гибкость реализации - потому что static члены на этих языках являются своего рода гражданами второго сорта.методы и свойства, к которым можно обращаться без экземпляра, были известны как class члены, а не static члены, и они могли бы быть virtual, и поэтому переопределялись в классах потомков.

Если вы работаетес языком, который предоставляет такие функции, как «члены виртуального класса (статические)» и некоторые другие, вы можете объединить Note/NoteManager вместе.

0 голосов
/ 23 апреля 2011

Я бы выбрал B , если только вы не захотите закончить как плохой старый PHP:

get_note_from_server_and_print_the_response($note, 'PHP, why must you be so disorganized?')

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

0 голосов
/ 23 апреля 2011

Согласно моему опыту, лучшая практика заключается в том, что до тех пор, пока вещи разделены, СУХАЯ - лучшая практика.Вы можете распространить заметку на менеджер заметок

Class Note
{
    //Some properties, etc
}

Class NoteManager 
{
    public static Note getNoteFromServer();
    public static UpdateNoteOnServer(Note);
}
0 голосов
/ 23 апреля 2011

Я бы выбрал «B». Причина в том, что вам может потребоваться использование «Note» с другим типом класса Controller, например, что вы сделали для NoteManager.Также дает вам возможность отделить ваши объекты данных или DTO или модель от ваших реальных классов контроллеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...