Single use case로부터 Collaboration을 고려해 communication diagram과 class diagram을 작성할 수 있다. 그렇다면 이제 '코드를 짜면' 되는건가?
:Object-Oriented detailed design 과정은 다음의 항목에 대한 디테일을 추가한다.
e.g. BankAccount class
nextAccountNumBER : Integer
/availableBalance : Money
accountName : String {not null}
quealification[0..10] : string
- 밑줄 : static 변수 (class-scope)
- / : derived 변수 (base class에서 가져온 속성)
- {not null} : option 값, null을 허용하지 않음
- array : [0..10] => 길이가 11인 배열 선언
uml의 함수 선언 및 정의
※ 함수명 (params list) : 반환형
e.g. BankAccount class
open(accountName:String):Boolean
getAccountName():Sting
모든 함수를 다 나타내지 않음
기본 생성자, 소멸자, get, set 함수는 표현하지 않음
매개변수가 존재하는 생성자는 나타냄
: attribute와 operation의 access level을 나타냄
symbol | visibility | description |
---|---|---|
+ | Public | 외부에서 접근 가능 |
- | Private | class 내부에서만 access |
# | Protected | class와 subclass에서 access |
~ | Package | package area에서 access |
① Coupling : degree of interconnectedness (object간 dependency)
② Cohesion : degree to which an element (operation, class, subsystem, system) contributes to a single purpose
①가 낮을수록 모듈화가 잘 되어있는(의존도가 낮은) 좋은 디자인이며 하나의 목적을 달성하도록 설계하여 ②를 만족해야함.
coupling의 정도를 어떻게 판단하는가?
ⓐ number of message types (얼마나 여러 종류의 function을 호출하는가 )
ⓑ number of parameters
ⓐ, ⓑ 를 minimize 하여 coupling(의존도)를 낮추는 방향으로 design하여야함
coupling을 최소화하여 최대한 change가 적도록 & reuse가 용이하도록 설계할 것
e.g. 다음과 같은 Lecturer class의 경우 'poor' class cohesion을 가진다. roomLength, roomWidth, calculateRoomSpace와 같은 속성은 lecturer class(강사 클래스)에서 굳이 제공할 필요가 없는 변수/함수이다.
Lecturer
lecturerName
lecturerAddress
roomNumber
roomLength
roomWidth
calculateRoomSpace()
그렇다면 위 class를 2개의 class로 분할하면 더 나을까?
Lecturer
lecturerName
lecturerAddress
Room
roomNumber
roomLength
roomWidth
calculateRoomSpace()
만약, Room을 사용하는 lecturer가 최대 3명이라고 하자.
i. 전자('poor' cohesion)의 경우, lecturer object를 3개 생성 & 3개의 object는 동일한 room 속성을 가짐
ii. 후자의 경우, room object 1개 생성해서 같은 방을 쓰는 lecturer이 이 object reference를 가지기만 하면됨 (better!)
※ 즉, 하나의 클래스에 가능한 많은 속성과 함수를 넣는 것이 인스턴스의 개수를 줄여 효율적일거 같지만, 결국 더 많은 instance를 생성하게 한다. 'poor' cohesion is bad!
You should do