2016-03-21 2 views
1

Law of Demeter (LOD) обескураживает длинную цепочку вызовов. Он говорит, чтобы вызывать методы только для объектов, непосредственно составленных внутри класса, или объектов, созданных внутри метода, объектов, переданных в качестве параметров в методах. Если B b; является полем в классе A и B, то поле имеет вид C, (C c;), а затем внутри A.java. Неправильная практика: b.c.performOperation();.Как адаптировать шаблон помощи в реализации Закона Деметры

В соответствии с моим пониманием мы должны иметь небольшие методы в каждом классе, выполняющие операции над полем, которое у них внутри, а внешний мир извлекает поля и вызывает методы. Также я понимаю, что для достижения этой цели мы можем использовать Visitor pattern. Но тогда я прочитал «Адаптер» - это также один из способов реализовать это, чего я не мог понять.

адаптер просто имеет объект класса Adaptee в нем, и реализует interface другой системы (как Adaptee и interface, находясь в-совместимых друг с другом,). Он использует делегирование для вызова метода на Adaptee. Здесь LOD не является швом, чтобы быть нарушенным, но я не могу понять, не будем ли мы использовать шаблон адаптера тогда, как нарушается закон?

Ссылка я взял из от сайта: http://c2.com/cgi/wiki/LawOfDemeter?LawOfDemeter

ObjectQueries? и AdapterPattern - это два способа реализовать закон LawEfDemeter . - DaveOrme

ответ

1

Это то, что я думаю, что они имеют в виду:

Когда они говорят об использовании шаблона адаптера в соответствии с законом Деметров, они говорят о другом случае, чем стандартное использование шаблона адаптера случае вы описали ,

Допустим, у нас есть класс, что кто-то написал, что подвергает открытое поле:

public class DataClass { 
    public Data data; 
} 

Когда мы хотим получить доступ поля данных в любом месте в нашем коде, мы получаем цепочку вызовов:

dataClass.data.doOperation() 

адаптер может быть использован для «спрятать» этот вызов цепи:

public class DataClassAdapter { 
    DataClass wrappedInstance; 

    public void doOperation() { 
     wrappedInstance.data.doOperation(); 
    } 
} 

Тогда мы можем кал l like:

dataAdapter.doOperation(); 

Без звонка.

Я бы сказал, что слово «Адаптер» здесь несколько неправильно используется. Хотя шаблон адаптера несколько схож.

+1

Развернуть по тому, что вы написали: Шаблон адаптера был слабо интерпретирован. * Методы Wrapper * - это решение для кода, который не поддерживает LoD. Адаптеры объектов могут быть * замечены * как обертки, потому что они конвертируют один общедоступный метод в некоторые другие серии инкапсулированных методов. Фасад может делать то же самое, что и просто делегирование (или косвенность). Однако, если вы рассматриваете [полиморфные вызовы] GoF Adapter [часть из его сути] (http://stackoverflow.com/a/13323703/1168342), то Object Adapter не является решением для кода, который не уважать LoD. – Fuhrmanator

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