2016-12-05 16 views
0

Мы реализовали шаблон проектирования адаптер, работа которого заключается в следующем:Design Pattern - Fat адаптер

  1. Закон в качестве связующего звена между обслуживания и доступа к данным слоев.
  2. Преобразование необработанных данных (из источника данных, внутреннего или внешнего) в данные, относящиеся к домену. Сделайте необходимую проверку и массирование.
  3. Иногда выполнение DAO-вызовов может зависеть от данных, которые не могут быть доступны из входных параметров, или, возможно, потребуется сделать дополнительные служебные вызовы на основе входных данных. Другими словами, адаптер не всегда может выполнять сопоставление 1: 1 между службой и DAO. Он может отображать один и тот же вызов из службы в разные вызовы DAO на основе входных параметров.

Пункт №3 начинает беспокоить меня, поскольку адаптеры становятся все более сложными, чем я изначально представлял. Я не знаю шаблона проектирования, чтобы обрезать адаптер. Есть ли это? Предложения?

ответ

1

Вы использовали то, что мне нравится называть «швейцарским армейским ножом».

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

+0

Я не думаю, что есть какое-либо значение при разделении 1 и 2. Код, который взаимодействует между двумя слоями, должен будет преобразовывать данные в и из этого, это заданный. Они делают это даже в GOF, который, как я думаю, не имеет шаблона брокера, возможно, по той причине, что он не отличается от адаптера. 3 это то, что меня волнует, и я сказал, что в моем вопросе. –

+0

@Abhi обычно имеет значение при разделении 1 и 2, и я делал именно это во многих случаях. 1 и 2 практически не связаны между собой. Но вы в лучшем месте, чтобы решить. Пока вы думаете о своем решении и можете объяснить это кому-то, кто хочет знать, почему вы внесли изменения, все будет в порядке. В худшем случае вам нужно сделать еще немного работы позже. Баст, все работает, и все счастливы. – Bohemian

-2

Вместо использования адаптера или полного репозитория (операции CRUD) я бы использовал интерфейс IReader для чтения и шаблона посетителя для удаления вставки update, поэтому вы можете отделить логику домена от деталей инфракрасной (persistance), здесь идея:

public class MyBusinessObject : IAcceptBusinessVisitor, IAcceptMyBusinessIdVisitor 
{ 
    private readonly string _id; 

    private string MyPrivateProp { get; set; } 
    //Fully encapsulated object 
    public MyBusinessObject(string id, string myPrivateProp) 
    { 
     _id = id; 
     MyPrivateProp = myPrivateProp; 
    } 

    public void UpdateMyProp(string newProp) 
    {    
     if (string.IsNullOrWhiteSpace(newProp)) throw new ArgumentNullException(nameof(newProp)); 
     //Business rules ... 
     MyPrivateProp = newProp; 
    } 

    public void Accept(IMyBusinessObjectVisitor visitor) 
    { 
     if (visitor == null) throw new ArgumentNullException(nameof(visitor)); 
     visitor.Visit(_id, MyPrivateProp); 
    } 

    public void Accept(IMyBusinessIdVisitor visitor) 
    { 
     if (visitor == null) throw new ArgumentNullException(nameof(visitor)); 
     visitor.Visit(_id); 
    } 
} 

public interface IAcceptBusinessVisitor 
{ 
    void Accept(IMyBusinessObjectVisitor visitor); 
} 

public interface IAcceptMyBusinessIdVisitor 
{ 
    void Accept(IMyBusinessIdVisitor visitor); 
} 

public interface IMyBusinessObjectVisitor 
{ 
    void Visit(string id, string prop); 
} 

public interface IMyBusinessIdVisitor 
{ 
    void Visit(string id); 
} 

public class SavePersistanceVitor : IMyBusinessObjectVisitor 
{ 
    public void Visit(string id, string prop) 
    { 
     //Save to Database 
    } 
} 

public class UpdatePersistanceVitor : IMyBusinessObjectVisitor 
{ 
    public void Visit(string id, string prop) 
    { 
     //Update to Database 
    } 
} 

public class DeleteVitor : IMyBusinessIdVisitor 
{ 
    public void Visit(string id) 
    { 
     //Delete in Database 
    } 
} 

здесь для чтения:

public interface IMyBusinessObjectReader 
{ 
    MyBusinessObject Read(string id); 
} 

class MyBusinessObjectReaderFromDb : IMyBusinessObjectReader 
{ 
    public MyBusinessObject Read(string id) 
    { 
     //Read from database 
     string myPrivateProp = ""; 
     return new MyBusinessObject(id, myPrivateProp); 
    } 
} 

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

+1

Я ценю, что вы тратите время, но я не думаю, что ваш ответ уместен. Прежде всего, я ничего не говорил о CRUD. На самом деле, в моем случае существуют только различные методы чтения.Во-вторых, шаблон посетителя предназначен для использования при наличии четкой иерархии, и должен быть добавлен новый метод, который либо не применяется ко всем классам в иерархии, либо добавляет, что это разрушительно для иерархии, ни одна из которых связано с проблемой, описанной в моем сообщении. [Здесь] (https://www.cs.virginia.edu/~horton/cs4240/slides/files/visitor.pdf) является прекрасным примером шаблона посетителя –

 Смежные вопросы

  • Нет связанных вопросов^_^