Каков термин для обозначения членов (членов, из ...), чтобы обеспечить их функциональность в классе с использованием композиции? - PullRequest
1 голос
/ 20 июня 2010

ОБНОВЛЕНИЕ : Мой оригинальный вопрос был не совсем ясен. Я ищу название принципа , который, как показано в примере ниже , нарушает .

(Я обновил пример кода, чтобы лучше напоминать сценарий, о котором я говорю. Исходный пример кода, который я включил, можно найти внизу. Это был плохо выбранный пример, потому что он иллюстрировал иерархическую структуру, которая на самом деле должен обеспечивать доступ к подчиненным элементам на произвольном уровне "глубины" и, кроме того, почти не имеет ничего общего с композицией, о чем я и хотел спросить.)


Я почти уверен, что есть термин для этого, и мне просто трудно думать об этом.

Пример неверного кода :

public interface IJumper
{
    void Jump();
}

public class Creature
{
    public IJumper Jumper;
}

var c = new Creature();
c.Jumper.Jump();

Пример лучшего кода :

public class Creature : IJumper
{
    private IJumper _jumper;

    public void Jump()
    {
        _jumper.Jump();
    }
}

var c = new Creature();
c.Jump();

Я почти уверен, что слышал это (выставление объекта-члена напрямую, чтобы все его свойства / методы были общедоступными), описанного как плохая вещь из-за [ вставьте здесь имя принципа ] , Какое слово я ищу?

(Обратите внимание, что я не спрашиваю , почему это / не плохо; я просто ищу термин, который для моей жизни я не помню.)


Пример кода ( bad ) :

public class Person
{
    public Person Child;
    // ...
}

Person p = new Person("Philip J. Fry");

// what is the term for this?
Person greatGrandchild = p.Child.Child.Child;

Ответы [ 4 ]

3 голосов
/ 20 июня 2010

Принципы, которые могут применяться к этому примеру:

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

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

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

Принцип разделения интерфейса : Зависимость одного класса от другого должна зависеть от наименьшего возможного интерфейса.

Вопрос, который вы должны определитьявляется ли написание вашего класса таким образом, где Child сам является частью интерфейса, является стабильным и минимальным интерфейсом, от которого зависят клиенты.В большинстве случаев программисты ОО предпочитают полагаться на явный набор методов в качестве своего интерфейса вместо элементов данных, чтобы они могли изменять элементы данных по своему усмотрению.Некоторые рекомендуют эту технику как изречение.Это может или не может применяться в вашем случае.

Есть еще один принцип, который может или не может применяться к вашему примеру:

Закон Деметры : Говорите только с вашим непосредственнымдрузья.

Закон Деметры не поощряет иерархии глубокого доступа, такие как p.Child.Child.Child.Зачем?Потому что клиенты тогда приобретают глубокие структурные знания об объектах, с которыми они разговаривают, и это увеличивает связь между клиентом и этими объектами.Сказав это, я думаю, что есть много примеров в мире, где это соединение приемлемо;вам нужно будет решить, применимо ли это и в вашем случае.

РЕДАКТИРОВАТЬ : с вашим пересмотренным примером Закон Деметры смотрит на меня гораздо ближе к тому, что вы ищете.

2 голосов
/ 20 июня 2010

Это называется цепочка методов (ну ... в этом примере это может быть цепочка свойств ).Он тесно связан с fulent интерфейсом .

Один из них должен быть искомым термином.

2 голосов
/ 20 июня 2010

Кажется, что он подходит для нескольких: цепочки сообщений, посредник, непристойное воздействие и, возможно, зависть к функциям. http://www.codinghorror.com/blog/2006/05/code-smells.html

Если этот шаблон используется часто, вам, вероятно, понадобится свойство GreatGrandChild, которое ищет его внутри.

0 голосов
/ 20 июня 2010

Нарушение Инкапсуляция ?

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