Лучший способ объединить разную ответственность - PullRequest
3 голосов
/ 11 февраля 2011

У меня есть приложение, которое считывает штрих-код, извлекает деталь и проверяет ее действительность.Я использую C #, Autofac и Nunit, и я не знаю, какая из них лучше:

Решение A : (Pattern Facade?)

public class Checker {
   public Checker(IBarcodeReader reader, IBarcodeParser parser) {
      ...
   }
   public bool Check() {
     string barcode = reader.Read();
     string id = parser.Parse(barcode);
     // check if id is valid

   }
}

Решение B : (шаблон стратегии?)

public class Checker {
   public Checker(IBarcodeReader reader) {
      ...
   }
   public bool Check() {
     string id = reader.Read();
     // check if id is valid

   }
}

public class BarcodeReader: IBarcodeReader {
   public BarcodeReader(IBarcodeParser parser) {
      ...
   }
   public string Read() {
     string barcode = ... // read barcode from device
     return parser.Parse(barcode);
   }
}

Ответы [ 5 ]

0 голосов
/ 11 февраля 2011

Решение B облегчает тестирование вашего класса Checker, что обычно является признаком того, что вы делаете что-то правильно. (Вы должны заглушить один метод меньше.)

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

0 голосов
/ 11 февраля 2011

Я бы выбрал ваше Решение B. Хотя оно не обязательно выглядит как шаблон стратегии, оно мне нравится, потому что в нем лучше разделены интересы. BarcodeReader является универсальным, он знает только, как прочитать части штрих-кода и отправить его обратно. Может использоваться для любого приложения, считывающего штрих-коды. Checker выглядит более специфично для бизнеса. Ваше первое решение - это смешивание бизнес-логики и общего считывания штрих-кодов. (Примечание: я предполагаю, что логика для проверки - это бизнес-логика, а не проверка по конкретному штрих-коду. Если это проверка по конкретному штрих-коду, то она должна идти в считывателе штрих-кода.)

Я бы смоделировал читателя после XmlReader. Он проверит правильность формата xml и т. Д.

0 голосов
/ 11 февраля 2011

Разве ты не переусердствовал?По крайней мере, так это выглядит на примере.Я бы отбросил идею шаблона стратегии.У вас когда-нибудь будет более одной стратегии?

Мне нравится первое решение (хорошая тестируемость и DI), но я бы не назвал трехстрочный код Фасадом.

0 голосов
/ 11 февраля 2011

Не предполагая ничего другого в вашем приложении, используйте Решение A. Оно сохраняет краткость и удобство обслуживания до тех пор, пока вы не обнаружите необходимость в дополнительной сложности Решения B. Третий вариант - даже не использовать конструкторы, ночтобы статические функции выполняли проверку.

Кроме того, я бы переименовал ваши функции.Они возвращают значения, но их имена не отражают это.Вы хотите использовать что-то вроде IsValid () вместо Check () и GetBarcode () вместо Read ().

0 голосов
/ 11 февраля 2011

Мне нравится решение A лучше, потому что, на мой взгляд, оно лучше справляется с разделением интересов. BarcodeReader считывает штрих-код и возвращает его в виде строки (что представляет собой штрих-код).

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