Является ли «Mapper» допустимым шаблоном дизайна или является ли он вариантом «Factory»?

Общий шаблон, который я вижу, это то, что известно как шаблон Mapper (не путать с DataMapper, что совсем другое), который принимает в качестве аргумента какой-то «сырой» источник данных (например, ADO.NET DataReader или DataSet) и сопоставляет поля свойствам на объекте бизнес /домен. Пример:

class PersonMapper
{
    public Person Map(DataSet ds)
    {
        Person p = new Person();
        p.FirstName = ds.Tables[0].Rows[0]["FirstName"].ToString();
        // other properties...
        return p;
    }
}

Идея - это ваш Gateway /DAO /Repository /etc. вызывается в Mapper до его возвращения, поэтому вы получаете богатый бизнес-объект по сравнению с базовым контейнером данных.

Однако, похоже, это связано, если не идентично, с шаблоном Factory (на языке DDD, anyways), который строит и возвращает объект домена. Википедия говорит, что это: фабрика DDD:

  

Заводские: методы для создания объектов домена должны делегировать специализированный объект Factory таким образом, чтобы альтернативные реализации могли легко меняться.

Из этой цитаты я могу думать только о том, что фабрика DDD-стиля может быть параметризована, чтобы она могла вернуть специализированный тип объекта, если возникла необходимость (например, BusinessCustomer против ResidentialCustomer), в то время как «Mapper» привязан к определенный класс и только выполняет перевод.

Итак, есть ли разница между этими двумя шаблонами или они по существу одно и то же с разными именами?

31 голос | спросил Wayne Molina 2 32011vEurope/Moscow11bEurope/MoscowWed, 02 Nov 2011 19:08:46 +0400 2011, 19:08:46

6 ответов


22

Хотя это первый раз, когда я слышу о шаблоне Mapper, для меня это больше похоже на шаблон Builder, а не на Factory.

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

Напротив, класс Builder всегда создает объекты одного класса. Вы бы использовали его, если создание объекта сложно, e. г. его конструктор принимает множество аргументов, не все из которых могут быть доступны мгновенно. Таким образом, объект-строитель может быть местом, в котором хранятся значения аргументов конструктора, пока вы их не найдете, и готовы создать «продукт», или он может предоставлять разумные значения по умолчанию и позволяет указывать только аргументы, значения которых вам нужно изменение. Типичным примером использования шаблона Builder является создание объектов, которые могут потребоваться в модульном тесте, чтобы избежать загромождения тестового кода всей логикой создания.

Мне Mapper звучит как вариант Builder, где параметры конструктора поступают в виде записи базы данных или какой-либо другой «необработанной» структуры данных.

ответил Dima 2 32011vEurope/Moscow11bEurope/MoscowWed, 02 Nov 2011 19:22:12 +0400 2011, 19:22:12
7

Единственная распространенная вещь в Mapper, Builder и Factory заключается в том, что они поставляют «сконструированный продукт» - и экземпляр объекта типа. Чтобы избежать путаницы, я имею в виду следующие обсуждения для их соответствующего определения.

  1. Mapper - близко к тому, что объясняется здесь: http: //www. codeproject.com/KB/library/AutoMapper.aspx . Это не то же самое, что и выше, но самое близкое, что я нашел о картографе.

  2. Builder - как определено здесь: http://www.oodesign.com/builder -pattern.html

  3. Factory - определяется здесь: http://www.oodesign.com/factory -pattern.html

Преобразователь по сути является конструктором наизнанку. Предположим, что какое-то время, если у вас нет сопоставления - когда вам все равно нужно множество параметров, все они являются аргументами в конструкторе. Теперь, когда все развивается, некоторые приложения не знают дополнительных атрибутов, которые нужно переходить в конструктор, где он либо вычисляет, либо использует значение по умолчанию. Самое главное, что mapper может сделать это для вас - и было бы более полезно, если бы это связало с внешними объектами решение такого алгоритма для построения.

Builder сильно отличается от компоновщика. Строитель необходим, когда полный объект состоит из многих частей объекта. Это своего рода сборка объектов, объединяя множество частей. Даже инициализация отдельных объектов детали связана с существованием других частей.

Заводские шаблоны выглядят очень просто с самого начала. Он возвращает вновь построенные объекты. Если любой обычный конструктор может дать мне полностью функциональный экземпляр, используя оператор типа new ()? почему мне нужна фабрика, которая дает мне такие же результаты?

Однако использование фабричных шаблонов, как правило, очень специфично; хотя чаще всего не отображается в литературе, где это применяется. Обычно приложение создает фабрику, которая совместно используется для различных объектов, которым необходимо создавать такие объекты продукта во время выполнения. Когда многие такие продукты создаются, метод Factory позволяет создавать объекты на основе определенной политики , например, можно принудительно создать определенный шаблон, который используется фабричным методом при создании всех объектов. Это не похоже на метод построения; здесь продукт выходит только один (и независимый). Это также не похоже на картограф; здесь внешний набор данных для создания объекта по клиенту фактически минимален. Заводская модель действительно обеспечивает (как следует из названия) последовательно похожие объекты продукта!

Dipan.

ответил Dipan Mehta 2 32011vEurope/Moscow11bEurope/MoscowWed, 02 Nov 2011 21:53:48 +0400 2011, 21:53:48
3

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

Если на самом деле Mapper не похож на фабрику или строителя. Mapper больше похож на шаблон (с использованием языка GoF). Шаблон адаптера обеспечивает функциональность для преобразования одного представления в другое. OP ссылается на DataSet и DataReader в ADO.NET - ну как насчет SqlDataAdapter? Ответ в названии. Mapper - это новое название того, о чем давно знают более старые программисты: адаптеры.

Mapper преобразует одно представление в другое - само определение шаблона адаптера.

ответил Reuben Soto 24 PM00000080000003731 2016, 20:27:37
2

ответ на ваш вопрос: Является ли «Mapper» действительным шаблоном проектирования? Да. Картонный шаблон, также известен как шаблон переводчика и является документированным шаблоном: http://www.iro.umontreal.ca/~keller/Layla/translator .pdf

ответил armandorv 28 J000000Saturday12 2012, 12:13:03
1

То, что вы делаете здесь, на самом деле является своего рода преобразованием типов (вы конвертируете свои необработанные данные в бизнес-объект). Вы можете использовать Factory Pattern для того, чтобы делать то, что (например, типы конверсий), так что да, каким-то образом ваш класс является фабрикой (хотя я бы использовал Статическая фабрика для этого).

ответил Oliver Weiler 2 32011vEurope/Moscow11bEurope/MoscowWed, 02 Nov 2011 20:07:45 +0400 2011, 20:07:45
0

Строители инкапсулируют сложную бизнес-логику для построения объекта. С другой стороны, Mapper должен просто скопировать поля из одного в другое.

Например карта из объекта «Сотрудник базы данных» в объект «Сотрудник домена», карта из объекта «Домен сотрудника» в клиентский контракт.

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

ответил user95940 7 J000000Sunday13 2013, 09:35:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132