💭
PlantUMLクラス図
前回までのあらすじ
シンプルに描く
@startuml ssample1
title: ユーザ申込API
skinparam class {
BackgroundColor<<API>> LightSkyBlue
BackgroundColor<<Batch>> LightGreen
BackgroundColor<<Service>> LightSalmon
BackgroundColor<<Repository>> Plum
}
interface EngagementRepository as "契約Repository\nEngagementRepository" <<Repository>>
interface UserRepository as "ユーザRepository\nUserRepository" <<Repository>>
class UserReferService as "ユーザ参照Service\nUserReferService" <<Service>>
UserReferService ----> UserRepository: 検索
UserReferService ----> EngagementRepository: 検索
class UserOrderCheckService as "ユーザ申込判定Service\nUserOrderCheckService" <<Service>>
class UserOrderService as "ユーザ申込Service\nUserOrderService" <<Service>>
UserOrderService --> UserRepository: 新規作成\n更新
UserOrderService --> UserReferService: ユーザ情報取得
UserOrderService --> UserOrderCheckService: 新規申込可否判定\n継続申込可否判定
UserOrderService --> EngagementRepository: 新規契約\n解約
class UserOrderApi as "ユーザ申込API\nUserOrderApi" <<API>>
UserOrderApi ----> UserOrderService: ユーザ申込
@enduml
property, method, private protected public
記号 | 修飾子 | 意味 |
---|---|---|
– | private | 自クラス のみアクセス可能 |
~ | package private | 自パッケージのクラス のみアクセス可能 |
# | protected | 自クラス と 派生クラス のみアクセス可能 |
+ | public | 全クラス アクセス可能 |
@startuml ssample2
title property, method / private protected public / abstract
namespace PackageSampleA {
namespace PackageSampleB {
namespace PackageA {
class ClassName1 {
{static} String field1
Number field2
Number field3
--
{static} void method1()
Number method2()
Boolean method3()
}
}
namespace PackageB {
class ClassName2 {
- private_field
~ package_private_field
# protected_field
+ public_field
--
- private_method()
~ package_private_method()
# protected_method()
+ public_method()
}
}
}
namespace PackageC {
abstract class AbstractClassName {
# field
--
- {abstract} method1()
# method2()
# method3()
}
interface InterfaceName {
- field
--
+ method()
}
}
}
@enduml
複雑に描いた例
@startuml ssample2
title 複雑でダメなクラス図の見本サンプル
namespace SampleImplements {
interface InterfaceName {
# field
--
- {abstract} method1()
# method2()
# method3()
}
class ClassA {}
class ClassA2 {}
note right
Generalization : 汎化
クラスA を クラスA2,
A3がA2を 継承
end note
class ClassA3 {}
class ClassB_Dependency {}
class ClassC_Aggregation {}
class ClassD_Composition {}
ClassA <|- ClassA2
ClassA2 <|-- ClassA3
InterfaceName <|.. ClassA
note left
Realization :
クラスA で InterfaceName 実装
(Implements )
end note
ClassA ..> ClassB_Dependency
note top
Dependency :
ClassA は ClassB に依存している
クラスB に変更すると クラスA の修正必要
クラスAがBのプロパティ参照、メソッド呼び出し
end note
ClassA o-- ClassC_Aggregation
note bottom
Aggregation :
Has - a (集約)
Aggregationとは部分クラスCがなくても
全体クラスAが存在できる関係
end note
ClassA <|--- ClassD_Composition
note left
Composition :
Contains - a (合成)
Compositionとは全体クラスAが
部分クラスDを所有
end note
}
@enduml
Discussion