В колледже я взял класс по современной физике, в котором мы узнали об особой теории относительности. Я был полностью потрясен тем, как различные системы отсчета могут фактически наблюдать физические свойства объекта, которые будут разными, и не будут ошибочными. Со временем эта концепция медленно меняла способ программирования, до такой степени, что теперь я склонен разбивать классы на 2 основные категории, объекты данных и объекты наблюдения (только функции).
Чтобы это не стало сложной и продолжительной почтой для такого простого вопроса, я попытаюсь объяснить, что я имею в виду, через два примера.
Сначала возьмите, например, этот тип кода, который я часто писал:
class Deck
{
private Card[] cards;
public void Shuffle()
{
// shuffle algorithm
}
// other deck related functions like draw, cut, etc...
}
Я обычно пишу тот же сценарий, что и:
class Deck
{
// by intention, i just mean some kind of immutable collection of cards
private ReadonlyCollection<Card> _Cards;
public Card[] Cards { get { return this._Cards; } }
}
interface IDeckHandler
{
Deck Shuffle(Deck deck);
// other deck related functions like draw, cut, etc..
}
class Dealer : IDeckHandler
{
// IDeckHandler implementation
}
Deck
больше не отвечает за реализацию функций, которые могут воздействовать на него. Или, чтобы он соответствовал терминологии, колода - это всего лишь набор ценностей, и способ, которым она соблюдается, несет ответственность наблюдателя. Естественно, может быть много наблюдателей, которые выполняют действия по-разному.
Во втором примере я буду использовать то, что люди, с которыми я пытался объяснить это, имели более легкое время. Возьмите ситуацию, когда у нас есть цветные буквы на цветной бумаге, в которой написано слово. У нас есть агент, которому поручено прочитать слово на бумаге. Теперь предположим, что агент - это какой-то цвет слепых. Изображение, выходящее из бумаги, одно и то же, но восприятие может быть другим. Наблюдатель не имеет интимного знания об объекте и не может его модифицировать, только реагирует на его интерпретацию.
Как я уже сказал, эта концепция управляет многими моими решениями в области развития. Итак, вернемся к вопросу, - это опубликованный тип программирования, и если да, можете ли вы указать мне на него литературу? Есть некоторые распространенные и необычные сценарии, с которыми я столкнулся, в которые трудно принимать решения, и, конечно же, некоторые вещи, о которых я просто не думал или не наткнулся, которые, надеюсь, были бы рассмотрены в литературе.