Как определить ответственность объекта в ООП? - PullRequest
1 голос
/ 12 июля 2011

Я только начал изучать ООП, и мне очень трудно определить, к какой функциональности относится.Давайте используем down голосование в SO для нашего примера:

Когда мы разыгрываем его, в транзакции должно произойти следующее:

  1. Уменьшение rep и * 1008 избирателя* count.
  2. Уменьшить получателя rep.
  3. Уменьшить сообщение score.

Итак ...

  1. Как мы определяем, какое действие принадлежит какому объекту?
  2. Где будет жить такая функциональность?На уровне DAO, на уровне служб или на самих объектах?

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

Ответы [ 2 ]

4 голосов
/ 12 июля 2011

Взгляните на SOLID принципы ОО дизайна, сцепления и сцепления.

OO может использоваться во многих местах, но не ограничивается, например, ваш бизнес уровень. Вы можете написать свой объектно-ориентированный Javascript.

Я бы смоделировал ваш пример SO домена аналогично этому (в C #). Это идеалистический ОО-код, и в реальном мире могут быть сделаны некоторые компромиссы, такие как обнародование полей для моего ORM. Что я пытаюсь показать - каждый объект отвечает за свои данные, никто другой не может изменить его напрямую; они должны попросить этот объект сделать что-то, вызвав один из открытых методов.

public class User
{
    private int _reputation;
    private int _downvotes;

    public void Downvote(Post post)
    {
        DecreaseReputation();
        IncrementDownvotes();
        post.Downvote();
    }

    public void RegisterDownvote()
    {
        DecreaseReputation();
    }

    private void DecreaseReputation()
    {
        _reputation--;
    }

    private void IncrementDownvotes()
    {
        _downvotes++;
    }
}

public class Post
{
    private int _score;
    private User _poster;

    public void Downvote()
    {
        DecreaseScore();
        _poster.RegisterDownvote();
    }

    private void DecreaseScore()
    {
        _score--;
    }
}
1 голос
/ 12 июля 2011

Ответить на этот вопрос непросто, и это больше похоже на вопрос о моделировании, чем вопрос ООП как таковой.В случае SO (я делаю предположение, основываясь на предполагаемых шаблонах проектирования для своего сайта), все «слои» шаблона проектирования участвуют в том, что вы называете «транзакцией» (не термин БД, я предполагаю, чтокак вы это используете).Слой пользовательского интерфейса или представление принимает «голосование против» и делает, как представляется, ajax-запрос, скорее всего, слою, который обрабатывает бизнес-правила, который определяет, что на самом деле происходит, когда «против» голосует против пользователя.В этот момент бизнес-уровень запрашивает у уровня данных обновление базы данных где-нибудь, чтобы обновить оценку пользователя, репутацию и т. Д. Это также может быть выполнено немного по-другому, используя веб-сервисы, которые знают, что скрыто в SO.,Насколько ООП;Я уверен, что внутри всегда много ООП, возможно, на всех уровнях, в скриптах и ​​других языках, но я думаю, что в случае с вашим примером SO не передает объект класса «Пользователь», когдаголос отдан;в этом нет необходимости.

Вот очень популярный шаблон проектирования MVC, например: http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

...