Абстрагирование данных в контексте для работы с будущим типом объекта (шаблон проектирования стратегии)? - PullRequest
0 голосов
/ 10 марта 2011

Мне нужно спроектировать структуру проверки данных, которая в основном разбивается на эти компоненты.

  1. Средства доступа к данным - что лучше иметь дело с этим

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

  3. Валидаторы (шаблон стратегии) ​​

Мне нужно применить некоторые правила к данным, но я не знаю, каким будет этот набор данных в будущем.

Так что я запутался после долгих размышлений о том, должны ли Правила знать о том, как выглядит объект, или это возможно без зависимости от Правил и данных (У меня такое ощущение, что да, но это не так. не знаю как). Мне сложно спроектировать абстракцию для набора данных.

какие-нибудь подсказки, в каком направлении я должен думать?

язык - C # (.NET)
платформа - Windows

РЕДАКТИРОВАТЬ: точный вопрос

в паттерне Stratagy, возможно ли, что Context может содержать общий объект, и стратегия может справиться с этим, не зная, как создается объект?

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

В среде валидации у вас обычно есть набор готовых правил, которые ничего не знают о том, как выглядит объект / сущность. Например, у вас может быть NotNullRule, чтобы проверить, что данное свойство не равно нулю:

//code is not REAL code!

var user = new User({username=null, email="hello@test.com");
var notNullrule = new NotNullRule( typeof(User).GetProperty("username"), user );
var errors = notNullrule.Check();
Debug.Assert( errors[0] == "Property Username cannot be null");

Обычно используют атрибуты, чтобы установить, какую стратегию валидации использовать для каких свойств класса. См. этот пример здесь .

Платформы валидации обычно позволяют также создавать собственные правила, которые могут быть специфичными для домена. Например:

public class CustomerIsEligibleForDiscount : Rule
{ 
    public void Check(){ ... }
}

Надеюсь, это поможет.

0 голосов
/ 10 марта 2011

Есть ли причина, по которой вы не можете использовать одну из многих существующих платформ валидации C # в качестве отправной точки? Как правило, они имеют встроенные соглашения для решения этих проблем.

0 голосов
/ 10 марта 2011

Если вы определяете абстрактный / базовый класс, который при необходимости вызывает абстрактный метод ValidateRules (), вы можете реализовать ValidateRules () в каждом классе, который наследуется от абстрактного / базового класса.

Объявление метода как абстрактного в базовом классе обеспечивает его реализацию в любом производном классе.

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