<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Uml on sharefun&#39;s blog</title>
        <link>https://sharefun.dev/tags/uml/</link>
        <description>Recent content in Uml on sharefun&#39;s blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-TW</language>
        <copyright>Hsueh-Fang Yeh</copyright>
        <lastBuildDate>Wed, 30 Mar 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://sharefun.dev/tags/uml/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>A Note on UML Class Diagram</title>
            <link>https://sharefun.dev/posts/uml-class-diagram/</link>
            <pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate>
            <guid>https://sharefun.dev/posts/uml-class-diagram/</guid>
            <description>&lt;p&gt;這是一篇學習 UML class diagram 的簡記。為保持文意清晰，用到術語時盡可能使用原文表示。&lt;/p&gt;&#xA;&lt;h3 id=&#34;dependency依賴&#34;&gt;Dependency（依賴）&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;定義：影響為單向。如 A 的變化不影響 B，B 的變化會影響 A，則 A 依賴 B。&lt;/li&gt;&#xA;&lt;li&gt;圖例：虛線連結，單向箭頭，由依賴方指向被依賴方。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    ClassA ..&gt; ClassB&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;UML syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;classDiagram&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassA ..&amp;gt; ClassB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;依賴關係是比較廣泛的描述，如下面的 Inheritance 和 Asscociation 也可以視為一種 Dependency，只是將這些比較常見且重要的依賴形式獨立出來便於使用。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;association&#34;&gt;Association&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;定義：廣義來說，Association 是包含 Aggregation 和 Composition 的，後二者是一種特化。若 A 與 B 之間可獨立存在，若 A 對 B 有存取權，則 A asscociates with B。Association 可以是雙向的。&lt;/li&gt;&#xA;&lt;li&gt;圖例：實線連結，箭頭從擁有者指向被擁有者。雙向連結時省略箭頭。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    ClassA &#34;1&#34; --&gt; &#34;*&#34; ClassB&#xA;    ClassC &#34;*&#34; --&gt; &#34;1&#34; ClassD&#xA;    ClassE -- ClassF&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;UML syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;classDiagram&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassA &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt; --&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt; ClassB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassC &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*&amp;#34;&lt;/span&gt; --&amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt; ClassD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassE -- ClassF&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;與 Aggregation, Composition 的相異處在於，Association 的類之間可以是對等的，也可以是從屬關係。習慣上我會直接將具有從屬關係的類用 Aggregation 或 Composition 表示，將對等關係的類保留給 Association。&lt;/li&gt;&#xA;&lt;li&gt;實例：一部汽車可以有一至多個 USB 風扇。電腦也可以有一至多個 USB 風扇。USB 風扇本身也可以單獨存在，甚至插到其他提供 USB 的插座上。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    汽車 &#34;1&#34; --&gt; &#34;*&#34; USB 風扇&#xA;    電腦 &#34;1&#34; --&gt; &#34;*&#34; USB 風扇&lt;/pre&gt;&lt;h3 id=&#34;aggregation&#34;&gt;Aggregation&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;定義：表示 A 與 B 有從屬（主體與附屬）關係。若 A 包含 B，但 B 可以被共享，則 A aggreates B。&lt;/li&gt;&#xA;&lt;li&gt;圖例：實線連結，空心菱形頭指向整體。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    ClassA &#34;1&#34; o-- &#34;N&#34; ClassB&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;UML syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;classDiagram&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassA &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt; o-- &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt; ClassB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;與 Composition 的相異處，在於 Aggrestion 的附屬類可以被共享，生命週期也不須與主體類相同。&lt;/li&gt;&#xA;&lt;li&gt;實例：一部汽車可以一至多個兒童安全座椅。每個兒童安全座椅只能附屬於汽車。一台座椅可以登記在幾台常用的車上，隨時可以拆換到其他車上使用。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    汽車 &#34;1&#34; o-- &#34;N&#34; 兒童安全座椅&lt;/pre&gt;&lt;h3 id=&#34;composition&#34;&gt;Composition&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;定義：表示 A 與 B 有從屬（主體與附屬）關係。若 A 包含 B，且 A 的完整性需要 B 才能完成，則 A is composed of B。&lt;/li&gt;&#xA;&lt;li&gt;圖例：實線連結，實心菱形頭指向整體。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    ClassA &#34;1&#34; *-- &#34;N&#34; ClassB&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;UML syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;classDiagram&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassA &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;1&amp;#34;&lt;/span&gt; *-- &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt; ClassB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;與 Composition 的相異處，在於 Composition 的主體與附屬無法單獨存在，生命週期相同。&lt;/li&gt;&#xA;&lt;li&gt;實例：一部汽車有四顆輪胎，但若沒有輪胎，車子就不完整。車子報銷後，輪胎也會跟著被回收或丟棄。（假設沒有被黑心廠商拿去裝到別的車上）&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    汽車 &#34;1&#34; *-- &#34;4&#34; 輪胎&lt;/pre&gt;&lt;h3 id=&#34;inheritance-generalization繼承&#34;&gt;Inheritance (Generalization)（繼承）&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;定義：B is a kind of A。A 為實體類，而 B 是 A 的一種特化。&lt;/li&gt;&#xA;&lt;li&gt;圖例：實線連結，空心箭頭指向被特化的類。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    ClassA &lt;|-- ClassB&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;UML syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;classDiagram&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassA &amp;lt;|-- ClassB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;使用 PlantUML 可以畫出空心箭頭，但使用 Mermaid 只能畫出如下的實心箭頭，不論是 Refactoring: Improving the Design of Existing Code 一書中使用空心箭頭，在白板上作圖，都是空心箭頭比較方便。不知 Mermaid 為何只能畫出實心箭頭。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;realization&#34;&gt;Realization&#xA;&lt;/h3&gt;&lt;ul&gt;&#xA;&lt;li&gt;定義：B realizes A。A 為通用的介面，而 B 實作該介面。&lt;/li&gt;&#xA;&lt;li&gt;圖例：虛線連結，空心箭頭指向介面。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;mermaid&#34; style=&#34;visibility:hidden&#34;&gt;classDiagram&#xA;    ClassA &lt;|.. ClassB&lt;/pre&gt;&lt;ul&gt;&#xA;&lt;li&gt;UML syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;classDiagram&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ClassA &amp;lt;|.. ClassB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;與 inheritance 相同，一樣存在 Mermaid 無法畫出空心箭頭的問題。&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
        </item></channel>
</rss>
