Изменяемый и неизменный с объектами бизнес-логики - PullRequest
1 голос
/ 14 мая 2011

Много было сказано об изменчивых / неизменных объектах в модели данных.

Но как насчет бизнес-логики?Например: проигрыватель компакт-дисков.Один класс отвечает за воспроизведение компакт-диска.

// Immutable version:
class Player
{
    CD cd;
    public Player(CD cd) { ... }
}

// Mutable version:
class Player
{
    CD cd;
    public void ChangeCD(CD cd) { ... }
}

Я могу вспомнить несколько тонких преимуществ и недостатков обеих версий.Например, когда проигрыватель является изменяемым, другие объекты могут захватывать проигрыватель, и он остается действительным, даже если компакт-диск изменяется.Когда игрок является неизменяемым, вам нужен объект-обертка (например, Command Pattern), который обновляется при создании нового игрока.

Какая версия предпочтительнее в каких случаях?Есть ли общие рекомендации?

1 Ответ

1 голос
/ 14 мая 2011

Вот третий вариант.

class Player
{
     // private CD myCD <- no private field for the CD
     public Player() {}
     public void playCD (CD cd) {}
}

Игрок никогда не должен владеть объектом CD. Надо просто сказать, что это CD-объект, проиграйте его.

Лучшим вариантом будет

class CDPlayer : DataPlayer
{
    public Player() {}
    public void playData (IData cd) {}
}

class CD : IData {}

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

Я считаю, что ваш пример немного ошибочен по отношению к вашему актуальному вопросу.

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