집계와 구성의 개념적 차이점을 알고 있습니다. 누군가 예제를 통해 Java의 구현 차이점을 말해 줄 수 있습니까?
집계와 구성의 개념적 차이점을 알고 있습니다. 누군가 예제를 통해 Java의 구현 차이점을 말해 줄 수 있습니까?
답변:
구성
final class Car {
private final Engine engine;
Car(EngineSpecs specs) {
engine = new Engine(specs);
}
void move() {
engine.work();
}
}
집합
final class Car {
private Engine engine;
void setEngine(Engine engine) {
this.engine = engine;
}
void move() {
if (engine != null)
engine.work();
}
}
구성의 경우 엔진은 자동차에 의해 완전히 캡슐화됩니다. 외부 세계가 엔진에 대한 참조를 얻을 수있는 방법은 없습니다. 엔진은 자동차와 함께 살고 죽습니다. 집계를 사용하면 자동차도 엔진을 통해 기능을 수행하지만 엔진이 항상 자동차의 내부 부분이되는 것은 아닙니다. 엔진을 교체하거나 완전히 제거 할 수도 있습니다. 뿐만 아니라 외부 세계는 여전히 엔진에 대한 참조를 가질 수 있으며 자동차에 있는지 여부에 관계없이이를 수정할 수 있습니다.
new Engine(EngineSpecs)
차가 없어도 호출을 사용하여 엔진을 만들 수 있습니다 . 컴포지션을 달성하는 방법은 Engine을 내부 클래스로 생성하는 것이므로 엔진의 객체는 항상 Car Object를 참조하여 생성됩니다
좋은 UML 예제를 사용합니다.
1 ~ 20 개의학과가 있고 각학과에 1 ~ 5 명의 교수가있는 대학을 선택합니다. 대학과학과 사이에는 구성 링크가 있습니다. 학과와 교수 사이에는 통합 링크가 있습니다.
작곡은 단지 강력한 집합체 일뿐입니다. 대학이 파괴되면 부서도 파괴되어야합니다. 하지만 각학과가 사라져도 교수를 죽이면 안된다.
자바에서 :
public class University {
private List<Department> departments;
public void destroy(){
//it's composition, when I destroy a university I also destroy the departments. they cant live outside my university instance
if(departments!=null)
for(Department d : departments) d.destroy();
departments.clean();
departments = null;
}
}
public class Department {
private List<Professor> professors;
private University university;
Department(University univ){
this.university = univ;
//check here univ not null throw whatever depending on your needs
}
public void destroy(){
//It's aggregation here, we just tell the professor they are fired but they can still keep living
for(Professor p:professors)
p.fire(this);
professors.clean();
professors = null;
}
}
public class Professor {
private String name;
private List<Department> attachedDepartments;
public void destroy(){
}
public void fire(Department d){
attachedDepartments.remove(d);
}
}
이 주위에 뭔가.
아래 주어진 URL에 훌륭한 설명이 있습니다.
http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit
확인해주십시오!!!
용어를 설정합시다. 집계는 UML 표준의 메타 용어이며 단순히 shared 라는 이름의 구성 및 공유 집계를 의미 합니다. 너무 자주 "집계"로 잘못 명명됩니다. 구성도 집계이기 때문에 BAD입니다. 내가 알기로는 "공유"를 의미합니다.
UML 표준에서 추가 :
복합-속성이 복합적으로 집계됨을 나타냅니다. 즉, 복합 객체가 구성된 객체 (부품)의 존재 및 저장을 담당합니다.
따라서 카테 드라는 대학 (IMHO) 외부에 존재하지 않기 때문에 대학과 카테 드라 연결은 구성입니다.
공유 집계의 정확한 의미는 애플리케이션 영역과 모델러에 따라 다릅니다.
즉, 자신이나 다른 사람의 일부 원칙 만 따르는 경우 다른 모든 연결을 공유 집계로 그릴 수 있습니다. 또한보고 여기 .
간단한 작곡 프로그램
public class Person {
private double salary;
private String name;
private Birthday bday;
public Person(int y,int m,int d,String name){
bday=new Birthday(y, m, d);
this.name=name;
}
public double getSalary() {
return salary;
}
public String getName() {
return name;
}
public Birthday getBday() {
return bday;
}
///////////////////////////////inner class///////////////////////
private class Birthday{
int year,month,day;
public Birthday(int y,int m,int d){
year=y;
month=m;
day=d;
}
public String toString(){
return String.format("%s-%s-%s", year,month,day);
}
}
//////////////////////////////////////////////////////////////////
}
public class CompositionTst {
public static void main(String[] args) {
// TODO code application logic here
Person person=new Person(2001, 11, 29, "Thilina");
System.out.println("Name : "+person.getName());
System.out.println("Birthday : "+person.getBday());
//The below object cannot be created. A bithday cannot exixts without a Person
//Birthday bday=new Birthday(1988,11,10);
}
}
먼저 동일한 페이지에있는 Aggregation
과 의 차이점에 대해 이야기해야합니다 Composition
.
집계는 연관된 엔티티가 연관과 독립적으로 존재할 수있는 연관입니다. 예를 들어, 개인은 조직에 연관 될 수 있지만 시스템에 독립적으로 존재할 수 있습니다.
이므로
구성이란 관련 엔티티 중 하나가 다른 엔티티와 밀접하게 관련되어 있고 다른 엔티티 없이는 존재할 수없는 상황을 말합니다. 실제로 해당 엔티티의 신원은 항상 다른 객체의 신원과 연관됩니다. 예를 들어, 자동차의 바퀴.
이제 다음과 같이 한 엔터티의 속성을 다른 엔터티에 유지하여 간단히 집계를 수행 할 수 있습니다.
class Person {
Organisation worksFor;
}
class Organisation {
String name;
}
class Main {
public static void main(String args[]) {
//Create Person object independently
Person p = new Person();
//Create the Organisation independently
Organisation o = new Organisation();
o.name = "XYZ Corporation";
/*
At this point both person and organisation
exist without any association
*/
p.worksFor = o;
}
}
Composition의 경우 종속 개체는 항상 연결된 개체의 ID로 만들어 져야합니다. 동일한 내부 클래스를 사용할 수 있습니다.
class Car {
class Wheel {
Car associatedWith;
}
}
class Main {
public static void main() {
//Create Car object independently
Car car = new Car();
//Cannot create Wheel instance independently
//need a reference of a Car for the same.
Car.Wheel wheel = car.new Wheel();
}
}
애플리케이션 시나리오에 따라 동일한 사용 사례가 집계 / 구성에 해당 할 수 있습니다. 예를 들어, 일부 조직에서 일하는 사람들을위한 애플리케이션을 개발하고 등록을 위해 조직에 대한 참조가 필수 인 경우 개인-조직 사례가 구성이 될 수 있습니다. 마찬가지로 자동차 부품에 대한 재고를 유지 관리하는 경우 Car-Wheel 관계가 집계가 될 수 있습니다.
두 유형은 물론 연관이며 실제로 그런 언어 요소에 엄격하게 매핑되지는 않습니다. 차이점은 목적, 컨텍스트 및 시스템 모델링 방법에 있습니다.
실용적인 예로, 유사한 엔티티를 가진 두 가지 유형의 시스템을 비교하십시오.
주로 자동차와 그 소유자 등을 추적 하는 자동차 등록 시스템 입니다. 여기서 우리는 별도의 엔터티로서 엔진에 관심이 없지만 동력 및 연료 유형과 같은 엔진 관련 속성이 여전히있을 수 있습니다. 여기서 엔진은 자동차 엔티티 의 복합 부분 일 수 있습니다 .
자동차 부품을 관리하고, 자동차를 정비하고, 부품 (아마도 완전한 엔진)을 교체 하는 자동차 서비스 점 관리 시스템 입니다. 여기에서 우리는 심지어 엔진을 비축하고 있고 그것들과 다른 부품을 개별적으로 그리고 자동차와 독립적으로 추적해야 할 필요가 있습니다. 여기서 엔진은 자동차 엔티티 의 집계 된 부분 일 수 있습니다 .
이 수준에서 가독성과 같은 것이 훨씬 더 중요하기 때문에 이것을 언어로 구현하는 방법은 사소한 문제입니다.