2014-11-28 3 views
4

Может кто-нибудь объяснить, что такое сцепление содержания, и как это произошло в следующем коде:Что такое связывание содержимого?

public class Line 
{ 
    private Point start, end; 
    ... 
    public Point getStart() { return start; } 
    public Point getEnd() { return end; } 
} 
  
public class Arch 
{ 
    private Line baseline; 
    ... 
    void slant(int newY) 
    { 
    Point theEnd = baseline.getEnd(); 
    theEnd.setLocation(theEnd.getX(),newY); 
    } 
} 

Спасибо.

ответ

4

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

У вас есть экземпляр Line, который хранится внутри вашего экземпляра Arch; и Line хранит два Point с. Когда вы вызываете slant() на Arch, он поднимает один из Point s изнутри Line и меняет его. Таким образом, базовый Point изменяет свое состояние.

Если этот Point был сохранен в другом месте вашего приложения, он мог бы получить шок, когда он обнаружил, что перемещен Point.

+0

Теперь ясно. Спасибо :) – Linda

+0

@ Linda приветствую :) –

+0

@ chiastic-security, Как решить эту проблему. В случае, если я хочу выставить некоторый метод, который полезен только для «Arch», а не для другой базы кода. Я создаю какой-то «ArchLine» в компоненте «Arch», который расширяет «Линия». – Shashank

0
  • Обеспечение всем следует правилу, которое говорит не изменять переменные экземпляра объектов, которые сами хранятся в переменных экземпляра других объектов
  • Использование неизменного или только для чтения интерфейса шаблоны проектирования
  • Создание всех переменных экземпляра и предоставлять доступ к таким методам, как getVal и setVal.
  • Если вы сделаете это, то вы быть уверены, что единственными местами, где переменные и изменяемые в этих методах
0

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

Это тесный (худший) вид связи, поскольку такие модули:

  • настоящих бедные абстракции
  • трудно понять
  • не могут быть изменены независимо друг от друга

В вашем примере Arch - это контент, связанный с Line, потому что Arch изменяет внутренние данные Line (Point экземпляров).

Теперь, если Line пришлось изменить способ он хранит данные, или добавить дополнительный код для обработки обновления точек, то Arch класс должен быть обновлен, а также, потому что он обходит интерфейс Line и использует интерфейс Point вместо ,

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