Friday, December 11, 2015

[UML Class relationships] Phân biệt quan hệ Association, Dependency và Navigability trong Objective C

Association

Miêu tả 1 kết nối đơn giản giữa 2 lớp với nhau. Tuỳ theo từng trường hợp có cách thể hiện sơ đồ khác nhau.

Mối quan hệ bình thường:


Theo sơ đồ này thì ClassA có sử dụng ClassB hoặc ngược lại, nhưng không giữ đối tượng đó. Code ví dụ trong objective C như sau:
@class ObjCAssociation_ClassB;
@interface ObjCAssociation_ClassA : NSObject {
}
- (void)doAction;
- (BOOL)doActionAssociation;
@end
view raw Association_h hosted with ❤ by GitHub
#import "ObjCAssociation_ClassA.h"
#import "ObjCAssociation_ClassB.h"
@implementation ObjCAssociation_ClassA
- (void)doAction {
NSLog(@"Action A");
}
- (BOOL)doActionAssociation {
NSLog(@"[Association] Action A");
[self doAction];
ObjCAssociation_ClassB* objB = [[ObjCAssociation_ClassB alloc] init];
[objB doAction];
return YES;
}
@end
view raw Association_m hosted with ❤ by GitHub
- (void)demoAssociation {
ObjCAssociation_ClassA* objA = [[ObjCAssociation_ClassA alloc] init];
[objA doActionAssociation];
}

Dependency:

Thể hiện mối quan hệ phụ thuộc yếu giữa lớp này với lớp kia qua mũi tên và số thành phần thể hiện. Vì thế lớp này không cần phải giữ thực thể của lớp kia. Có thể truyền thông qua tham số hoặc tự khởi tạo trong chính lớp sử dụng.
Theo sơ đồ này thì ClassA có sử dụng ClassB, nhưng không giữ đối tượng đó. Code ví dụ trong objective C như sau:
@class ObjCAssociation_ClassB;
@interface ObjCAssociation_ClassA : NSObject {
}
- (BOOL)doActionDependency;
- (BOOL)doActionDependency:(ObjCAssociation_ClassB*)obj;
@end
view raw Dependency_h hosted with ❤ by GitHub
#import "ObjCAssociation_ClassA.h"
#import "ObjCAssociation_ClassB.h"
@implementation ObjCAssociation_ClassA
- (BOOL)doActionDependency {
NSLog(@"[Dependency] Action A");
ObjCAssociation_ClassB* objB = [[ObjCAssociation_ClassB alloc] init];
[objB doAction];
return YES;
}
- (BOOL)doActionDependency:(ObjCAssociation_ClassB*)obj {
NSLog(@"[Dependency] Action A");
if (obj) {
[obj doAction];
return YES;
}
return NO;
}
@end
view raw Dependency_m hosted with ❤ by GitHub


Navigability:

Thể hiện mối quan hệ phụ thuộc mạnh giữa lớp này với lớp kia qua mũi tên và số thành phần thể hiện. Vì thế lớp này phải giữ thực thể của lớp kia chỉ được get chứ không cho set (readonly).

Mối quan hệ Association - Navigability (0..1):

Theo sơ đồ này thì ClassA có sử dụng ClassB, và giữ đối tượng đó để có thể truy xuất bằng property. Nhưng ClassB không biết sự tồn hoặc không chứa ClassA. Code ví dụ đối tượng này và demo trong objective C như sau:
@class ObjCAssociation_ClassB;
@interface ObjCAssociation_ClassA : NSObject {
}
@property (nonatomic, strong, readonly)ObjCAssociation_ClassB* classB;
- (BOOL)doActionAssociationToNavigability;
- (BOOL)doActionAssociationToRefNavigability;
- (BOOL)doActionAssociationToRefNavigability:(ObjCAssociation_ClassB*)obj;
@end
view raw Navigability_h hosted with ❤ by GitHub
#import "ObjCAssociation_ClassA.h"
#import "ObjCAssociation_ClassB.h"
@implementation ObjCAssociation_ClassA
@synthesize classB;
- (void)doAction {
NSLog(@"Action A");
}
- (BOOL)doActionAssociationToNavigability {
NSLog(@"[Association-Navigability] Action A");
classB = [[ObjCAssociation_ClassB alloc] init];
[classB doAction];
return YES;
}
- (BOOL)doActionAssociationToRefNavigability {
NSLog(@"[Association-Navigability] Action B");
if (classB) {
[classB doAction];
return YES;
}
return NO;
}
- (BOOL)doActionAssociationToRefNavigability:(ObjCAssociation_ClassB*)obj {
NSLog(@"[Association-Navigability] Action C");
classB = obj;
if (classB) {
[classB doAction];
return YES;
}
return NO;
}
@end
view raw Navigability_m hosted with ❤ by GitHub
- (void)demoAssociationToNavigability1 {
ObjCAssociation_ClassA* objA = [[ObjCAssociation_ClassA alloc] init];
[objA doActionAssociationToNavigability];
//Class A can access Class B
ObjCAssociation_ClassB* refObjB = objA.classB;
[refObjB doAction];
}
- (void)demoAssociationToNavigability2 {
ObjCAssociation_ClassB* objB = [[ObjCAssociation_ClassB alloc] init];
ObjCAssociation_ClassA* objA = [[ObjCAssociation_ClassA alloc] init];
objA.classB = objB;
[objA doActionAssociationToRefNavigability];
//Class A can access public objects of class B
ObjCAssociation_ClassB* refObjB = objA.classB;
[refObjB doAction];
}
- (void)demoAssociationToNavigability3 {
ObjCAssociation_ClassB* objB = [[ObjCAssociation_ClassB alloc] init];
ObjCAssociation_ClassA* objA = [[ObjCAssociation_ClassA alloc] init];
[objA doActionAssociationToRefNavigability:objB];
//Class A can access public objects of class B
ObjCAssociation_ClassB* refObjB = objA.classB;
[refObjB doAction];
}

Mối quan hệ Association - Navigability (0..n):

Theo sơ đồ này thì ClassA chứa danh sách ClassB. Code ví dụ như sau:
@class ObjCAssociation_ClassB;
@interface ObjCAssociation_ClassA : NSObject {
}
@property (nonatomic, strong, readonly)NSMutableArray* classBList;
//Return Bool for write unit test
- (BOOL)doActionAssociationToManyRefNavigability:(ObjCAssociation_ClassB*)obj;
@end
- (BOOL)doActionAssociationToManyRefNavigability:(ObjCAssociation_ClassB*)obj {
if (!classBList) {
classBList = [[NSMutableArray alloc] init];
}
if (obj) {
[obj doAction];
[classBList addObject:obj];
return YES;
}
return NO;
}
- (void)demoAssociationToNavigability4 {
ObjCAssociation_ClassB* objB1 = [[ObjCAssociation_ClassB alloc] init];
ObjCAssociation_ClassB* objB2 = [[ObjCAssociation_ClassB alloc] init];
ObjCAssociation_ClassA* objA = [[ObjCAssociation_ClassA alloc] init];
[objA doActionAssociationToManyRefNavigability:objB1];
[objA doActionAssociationToManyRefNavigability:objB2];
//Class A can access public objects of class B
for (ObjCAssociation_ClassB* refObjB in objA.classBList) {
[refObjB doAction];
}
}

Kết luận đường gạch giữa Dependency và Navigability:

- Những đường gạch liền thể hiện mối quan hệ mạnh và giữ đối tượng kia.
- Những đường gạch đứt quãng thể hiện mối quan hệ yếu và không giữ đối tượng kia.

Tài liệu tham khảo:

  1. BeginnersBook
  2. Vaughnvernon
  3. Modernanalyst

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.