<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"><channel><title>Days of ... (uml)</title><link>http://blog.yellowbluebus.com</link><description>Useful technology stuff</description><lastBuildDate>Wed, 03 Jul 2013 12:03:00 GMT</lastBuildDate><generator>nikola</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Ruby on Rails books teach wrong OO</title><link>http://blog.yellowbluebus.com/posts/wordpress20061122ruby-on-rails-books-teach-wrong-oo.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;I was reading a lot of Ruby on Rails books in order to start my own project. I found the thing, which really disturbes me: though Ruby is a proper OO language, none of OO desugn features are presented in Rails books.&lt;/p&gt; &lt;p&gt;Proper Object Oriented Design should simplify software development by introducing abstraction from unneccessary logic constraints.&lt;/p&gt; &lt;p&gt;Take, for example, books dealing with making simple online store. They all say that there is no way to add products into shopping cart because products can be in many shopping carts. Because of that you have to add LineItems, which will point to a product description. &lt;/p&gt; &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="106" src="http://www.yellowbluebus.com/blog/wp-content/uploads/2006/11/WindowsLiveWriter/RubyonRailsbooksteachwrongOO_8386/image0131.png" width="625" border="0"&gt;&lt;/p&gt; &lt;p&gt;This is true when we speak about database design, but completely untrue when we speak about software design. From OO point of view there is no such thing as LiteItem. It has no value to a business logic and it must be dropped from model.&lt;/p&gt; &lt;p&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="104" src="http://www.yellowbluebus.com/blog/wp-content/uploads/2006/11/WindowsLiveWriter/RubyonRailsbooksteachwrongOO_8386/image0_thumb111.png" width="610" border="0"&gt;&lt;/p&gt; &lt;p&gt;This model look much cleaner and causes no confusion. Additional work must be done on model layer, but this is just to avoid database limitations.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress20061122ruby-on-rails-books-teach-wrong-oo.html</guid><pubDate>Wed, 22 Nov 2006 09:41:17 GMT</pubDate></item><item><title>Sequence Diagram Guidelines revisited</title><link>http://blog.yellowbluebus.com/posts/wordpress20060726sequence-diagram-guidelines-revisited.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Strive for left-to-right ordering of  messages.
&lt;blockquote&gt;And if you need to put right-to-left non-return message - consider using another instance of the swimline&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Layer classifiers

&lt;blockquote&gt;Huh?&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Give an actor the same name as a class, if  necessary.&lt;blockquote&gt;We are not dealing with classes in sequence diagrams, so give name to the instance of the actor's class.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Include a prose description of the logic.&lt;blockquote&gt;Not always needed, but helps in complicated places.&lt;/blockquote&gt;&lt;/li&gt;

&lt;!--adsense#links--&gt;

&lt;li&gt;Place proactive system actors on the left-most side of your  diagram.&lt;blockquote&gt;Actors are always start interactions. This is whe they called actors - they act.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Place reactive system actors on the right-most side of your  diagram.&lt;blockquote&gt;No actors in the right side of the diagram at all. This is the rule!&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Avoid modeling object destruction.&lt;blockquote&gt;Model object destruction freely if it whats you modeling.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Don’t sweat activation boxes.&lt;blockquote&gt;Again - if it is required you have to model it. Don't leave it for developer to decide.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Name objects when you reference them in messages.&lt;blockquote&gt;Don't do it. It will add much more complexity to the message signatures with no added value.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt; Name objects when several of the same type exist.&lt;blockquote&gt;Name all objects. This is what developer will do anyway.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Apply textual stereotypes to classifiers consistently.&lt;/li&gt;

&lt;li&gt;Apply visual stereotypes sparingly.&lt;/li&gt;

&lt;li&gt;Focus on critical interactions.&lt;/li&gt;

&lt;li&gt;Justify message names beside the arrowhead.&lt;blockquote&gt;Don't waste your time. This will not be appreciated.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Create objects directly.&lt;blockquote&gt;Is there another way? I think not.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Apply operation signatures for software messages.&lt;/li&gt;

&lt;li&gt;Apply prose for messages involving human and organization actors.&lt;/li&gt;

&lt;li&gt;Prefer names over types for parameters.&lt;blockquote&gt;This is true, but you should also set the types for all parameters too.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Indicate types as parameter placeholders.&lt;/li&gt;

&lt;li&gt;Apply the &amp;gt; stereotype for use case invocations.&lt;blockquote&gt;No use case invocations in sequence diagrams! It is possible, but will not help developer. Remember: sequence diagram is for developers.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Do not model obvious return values.&lt;blockquote&gt;Model them! Let developer know that return value is expected.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Model a return value only when you need to refer to it  elsewhere on a diagram.&lt;blockquote&gt;Model it everywhere.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Justify return values beside the arrowhead.&lt;blockquote&gt;Waste of time!&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Model return values as part of a method invocation.&lt;blockquote&gt;Before it was said that we don't have to model return values and not we need to model them? As I said - model return values all time.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Indicate types as return-value placeholders.&lt;blockquote&gt;Model them in the method signature.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Indicate the actual value for simple return values.&lt;blockquote&gt;Indicate the type of the return value. Anything else goes into comments.&lt;/blockquote&gt;&lt;/li&gt;

&lt;p&gt;&lt;/p&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress20060726sequence-diagram-guidelines-revisited.html</guid><pubDate>Wed, 26 Jul 2006 13:52:39 GMT</pubDate></item><item><title>Activity Diagrams Guidelines revisited</title><link>http://blog.yellowbluebus.com/posts/wordpress20060726activity-diagrams-guidelines-revisited.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Last year, after reading a book about UML, I wrote &lt;a href="http://www.yellowbluebus.com/blog/category/uml/"&gt;a set of posts&lt;/a&gt; with distilled UML guidelines. Now it is the time to look at them again and put some comments on usage. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Place the start point in the top-left  corner.
&lt;blockquote&gt;I tend to create vertical activity diagrams, so I usually place the start on top and in center. This way looks more visual.&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Include an ending point.

&lt;blockquote&gt;What? No ending point? So activity never ends? I always have at least one ending point&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Simplify operations requiring flow charts.

&lt;blockquote&gt;The whole goal of activity diagrams is to visualize and, if possibly, simplify the process. &lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Question “black-hole” activities.  Question “miracle” activities.

&lt;blockquote&gt;I would question any activities. It is very usual to have some unneccesary work only because analyst and/or client do not fully understand what is needed and what is achievable&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Reflect the previous activity by using decision points.&lt;/li&gt;

&lt;li&gt;Avoid superfluous decision points.&lt;/li&gt;

&lt;li&gt;Ensure that each transition leaving a decision point has a guard.

&lt;blockquote&gt;If there is no guard then what this flow is trying to decide?&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Do not overlap guards.

&lt;blockquote&gt;Huh?&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Ensure that guards on decision points form a complete set.&lt;blockquote&gt;And if they not - why do you have decision point, by the way?&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Ensure that exit transition guards and activity invariants form a complete set.&lt;/li&gt;

&lt;li&gt;Apply an [otherwise] guard for “fall-through” logic.

&lt;blockquote&gt;This one support the thesis about having the complete set of the guards next to each decision point.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Model guards only if they add value.

&lt;blockquote&gt;If you don't have real guards - you should not have the decision point  in this place&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Ensure that forks have corresponding joins.

&lt;blockquote&gt;Not always true -  some of the forked processes may be terminated before they go to the join. Messaging is a good example.&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Ensure that a fork has only one entry transition.&lt;/li&gt;

&lt;li&gt;Ensure that a join has only one exit transition.&lt;/li&gt;

&lt;li&gt;Avoid superfluous forks.&lt;/li&gt;

&lt;li&gt;Order swimlanes in a logical manner.

&lt;blockquote&gt;It is all about logic, why say more?&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Apply swimlanes to linear processes.&lt;/li&gt;

&lt;li&gt;Have less than five swimlanes.&lt;blockquote&gt;I would say that is you trying to add fourth swimlane, you are already creating something bigger, than anybody in your team can comprehend without asking you more questions. It is time to simplify the activity.&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Consider swimareas for complex diagrams.&lt;blockquote&gt;Consider to use UML2 and include sub-activities in this activity&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Reorganize into smaller activity diagrams when swimareas  include several activities.&lt;blockquote&gt;Yes, very good point.&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Consider horizontal swimlanes for business processes.&lt;blockquote&gt;Well, it depends on business process and your preference.&lt;/blockquote&gt;

&lt;/li&gt;

&lt;li&gt;Model the key activities in the primary swimlane.&lt;blockquote&gt;Good point. If you don't have key activities in the primary swimlane chances are that you modeling incorrect activity.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;&lt;!--adsense#links--&gt;&lt;/li&gt;

&lt;li&gt;Place shared action objects on swimlane separators.&lt;/li&gt;

&lt;li&gt;Apply state names when an object appears several times.&lt;/li&gt;

&lt;li&gt;Reflect the life-cycle stage of an action object in its  state name.&lt;blockquote&gt;And use color, if your modelling program allows it.&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Show only critical inputs and outputs.&lt;/li&gt;

&lt;li&gt;Depict action objects as smaller than  activities.&lt;/li&gt;

&lt;p&gt;&lt;/p&gt;&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress20060726activity-diagrams-guidelines-revisited.html</guid><pubDate>Wed, 26 Jul 2006 09:03:36 GMT</pubDate></item><item><title>Rational Software Architect: simple guide</title><link>http://blog.yellowbluebus.com/posts/wordpress20060125rational-software-architect-simple-guide.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Everybody, who worked with Rational tools could think that there is nothing rational in them. And frustration mounts when you'll try to read the supplied documentation. The documentation is structured, but some pages are very shallow and others do not explain topics in undestandable language.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www-128.ibm.com/developerworks/rational/library/05/0816_Louis/?ca=drs-"&gt;This article&lt;/a&gt; is very helpful. It actually shows how to structure design files, so the design will be understandable by anyone in the project.&lt;/p&gt;
&lt;p&gt;At the end of page is a little gem: Software Architecture Document for the project, described in the article. Very very helpful!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://technorati.com/tag/architecture" rel="tag"&gt;architecture&lt;/a&gt;, &lt;a href="http://technorati.com/tag/rational" rel="tag"&gt;rational&lt;/a&gt;, &lt;a href="http://technorati.com/tag/uml" rel="tag"&gt;UML&lt;/a&gt;, &lt;a href="http://technorati.com/tag/rup" rel="tag"&gt;RUP&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress20060125rational-software-architect-simple-guide.html</guid><pubDate>Wed, 25 Jan 2006 15:34:00 GMT</pubDate></item><item><title>Activity Diagram Guidelines</title><link>http://blog.yellowbluebus.com/posts/wordpress2005061544.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Place the start point in the top-left  corner.&lt;/i&gt; &lt;/p&gt;
&lt;/li&gt;&lt;li&gt; &lt;p&gt;Include an ending point.&lt;a name="508"&gt;&lt;/a&gt;&lt;a name="beginpage.FFA95C38-845E-4E68-A167-A88924CA85711922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Simplify operations requiring flow  charts.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Question “black-hole” activities.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Question “miracle” activities.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Reflect the previous activity by using decision points.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid superfluous decision points.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Ensure that each transition leaving a decision point has a  guard.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not overlap guards.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Ensure that guards on decision points form a complete  set.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Ensure that exit transition guards and activity invariants  form a complete set.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply an [otherwise] guard for “fall-through” logic.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model guards only if they add value.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Ensure that forks have corresponding joins.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Ensure that a fork has only one entry transition.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Ensure that a join has only one exit transition.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid superfluous forks.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Order swimlanes in a logical manner.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply swimlanes to linear processes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Have less than five swimlanes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Consider swimareas for complex diagrams.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Reorganize into smaller activity diagrams when swimareas  include several activities.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Consider horizontal swimlanes for business processes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model the key activities in the primary swimlane.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place shared action objects on swimlane separators.&lt;a name="509"&gt;&lt;/a&gt;&lt;a name="beginpage.F90D634A-58D4-43B5-827C-9DB70784F9EC1922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Apply state names when an object appears  several times.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Reflect the life-cycle stage of an action object in its  state name.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Show only critical inputs and outputs.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Depict action objects as smaller than  activities.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;  ]]&amp;gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress2005061544.html</guid><pubDate>Wed, 15 Jun 2005 13:56:20 GMT</pubDate></item><item><title>Sequence Diagram Guidelines</title><link>http://blog.yellowbluebus.com/posts/wordpress2005061546.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Strive for left-to-right ordering of  messages.&lt;/i&gt; &lt;/p&gt;
&lt;/li&gt;&lt;li&gt; &lt;p&gt;Layer classifiers.&lt;a name="502"&gt;&lt;/a&gt;&lt;a name="beginpage.600B4932-3980-4F45-99EF-0306564408931922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Give an actor the same name as a class, if  necessary.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Include a prose description of the logic.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place proactive system actors on the left-most side of your  diagram.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place reactive system actors on the right-most side of your  diagram.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid modeling object destruction.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Don’t sweat activation boxes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name objects when you reference them in messages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name objects when several of the same type exist.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply textual stereotypes to classifiers consistently.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply visual stereotypes sparingly.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Focus on critical interactions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Justify message names beside the arrowhead.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Create objects directly.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply operation signatures for software messages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply prose for messages involving human and organization  actors.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Prefer names over types for parameters.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate types as parameter placeholders.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply the &amp;gt;  stereotype for use case invocations.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not model obvious return values.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model a return value only when you need to refer to it  elsewhere on a diagram.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Justify return values beside the arrowhead.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model return values as part of a method invocation.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate types as return-value placeholders.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate the actual value for simple return  values.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;  ]]&amp;gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress2005061546.html</guid><pubDate>Wed, 15 Jun 2005 13:55:02 GMT</pubDate></item><item><title>Package Diagram Guidelines</title><link>http://blog.yellowbluebus.com/posts/wordpress2005061547.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;h3&gt;&lt;a name="500"&gt;&lt;/a&gt;&lt;a name="wbp15Chapter13P1231922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;&lt;/h3&gt; &lt;ol&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Create class package diagrams to logically  organize your design.&lt;/i&gt; &lt;/p&gt;
&lt;/li&gt;&lt;li&gt; &lt;p&gt;Create UML component diagrams to physically organize your  design.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place inheriting packages below base packages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Vertically layer class package diagrams.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Create use case package diagrams to organize your  requirements.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Include actors on use case package diagrams.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Horizontally arrange use case package diagrams.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Give packages simple, descriptive names.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Make packages cohesive.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate architectural layers with stereotypes on  packages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid cyclic dependencies between packages.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Reflect internal relationships in package  dependencies.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt; ]]&amp;gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress2005061547.html</guid><pubDate>Wed, 15 Jun 2005 13:54:21 GMT</pubDate></item><item><title>Class Diagram Guidelines</title><link>http://blog.yellowbluebus.com/posts/wordpress2005061548.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Identify responsibilities on domain class  models.&lt;/i&gt; &lt;/p&gt;
&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate visibility only on design models.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate language-dependent visibility with property  strings.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate types on analysis models only when the type is an  actual requirement.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Be consistent with attribute names and types.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model association classes on analysis diagrams.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not name associations that have association classes.&lt;a name="497"&gt;&lt;/a&gt;&lt;a name="beginpage.0C77C366-5473-491E-928C-E94C6ED34BAA1922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Center the dashed line of an association  class.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Use common terminology for class names.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Prefer complete singular nouns for class names.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name operations with a strong verb.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name attributes with a domain-based noun.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not model scaffolding code.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not model keys.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Never show classes with just two compartments.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Label uncommon class compartments.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Include an ellipsis ( . . . ) at the end of incomplete  lists.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;List static operations/attributes before instance  operations/attributes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;List operations/attributes in decreasing visibility.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;For parameters that are objects, list only their type.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Develop consistent operation and attribute signatures.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid stereotypes implied by language naming  conventions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate exceptions in an operation’s property string.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Reflect implementation language constraints in interface  definitions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name interfaces according to language naming  conventions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Prefer “lollipop” notation to indicate realization of an  interface.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Define interfaces separately from your classes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not model the operations and attributes of interfaces in  your classes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model relationships horizontally.&lt;a name="498"&gt;&lt;/a&gt;&lt;a name="beginpage.EDFFC3AE-0792-43F8-ABF7-7EA350E86F8F1922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Model collaboration between two elements  only when they have a relationship.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Model a dependency when the relationship is transitory.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Tree-rout similar relationships to a common class.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Always indicate the multiplicity.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid a multiplicity of “*”.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Replace relationship lines with attribute types.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not model implied relationships.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not model every dependency.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Center names on associations.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Write concise association names in active voice.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate directionality to clarify an association name.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name unidirectional associations in the same direction.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Word association names left to right.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate role names when multiple associations between two  classes exist.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate role names on recursive associations.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Make associations bi-directional only when collaboration  occurs in both directions.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Redraw inherited associations only when something  changes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Question multiplicities involving minimums and maximums.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply the sentence rule for inheritance.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place subclasses below superclasses.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Beware of data-based inheritance.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;A subclass should inherit everything.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply the sentence rule for aggregation.&lt;a name="499"&gt;&lt;/a&gt;&lt;a name="beginpage.2391E9DD-2B6D-4755-A537-CF1A4026B1781922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Be interested in both the whole and the  part.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place the whole to the left of the part.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply composition to aggregates of physical items.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply composition when the parts share their persistence  life cycle with the whole.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Don’t worry about the diamonds.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;  ]]&amp;gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress2005061548.html</guid><pubDate>Wed, 15 Jun 2005 13:53:37 GMT</pubDate></item><item><title>Use Case Diagram Guidelines</title><link>http://blog.yellowbluebus.com/posts/wordpress2005061549.html</link><description>&lt;html&gt;&lt;body&gt;&lt;p&gt;&lt;/p&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Name use cases using domain  terminology.&lt;/i&gt; &lt;/p&gt;
&lt;/li&gt;&lt;li&gt; &lt;p&gt;Imply timing considerations by stacking use cases.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place your primary actor(s) in the top-left corner of the  diagram.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Draw actors on the outside edges of a use case diagram.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name actors with singular, domain-relevant nouns.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Associate each actor with one or more use cases.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Name actors to model roles, not job titles.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Use &amp;gt; to  indicate system actors.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Don’t allow actors to interact with one another.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Introduce an actor called “time” to initiate scheduled  events.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate an association between an actor and a use case if  the actor appears within the use case logic.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid arrowheads on actor-use case relationships.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply &amp;gt; when  you know exactly when to invoke the use case.&lt;a name="495"&gt;&lt;/a&gt;&lt;a name="beginpage.F5571810-646B-45AE-B63A-2B5BCB78FC511922DF93-71D0-459A-B7DE-81558B52170D"&gt;&lt;/a&gt;  &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Apply &lt;/i&gt;&amp;gt; &lt;i&gt;when a use case may  be invoked across several use case steps.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply &amp;gt;  associations sparingly.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Generalize use cases when a single condition results in  significantly new business logic.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Do not apply &amp;gt;, &amp;gt;,  or &amp;gt;. &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;&lt;i&gt;Avoid more than two levels of use case  associations.&lt;/i&gt; &lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place an included use case to the right of the invoking use  case.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place an extending use case below the parent use case.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply the “is like” rule to use case generalization.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place an inheriting use case below the base use case.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Apply the “is like” rule to actor inheritance.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Place an inheriting actor below the parent actor.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Indicate release scope with a system boundary box.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt; &lt;p&gt;Avoid meaningless system boundary boxes.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;/li&gt;  ]]&amp;gt;&lt;/body&gt;&lt;/html&gt;</description><guid>http://blog.yellowbluebus.com/posts/wordpress2005061549.html</guid><pubDate>Wed, 15 Jun 2005 13:53:00 GMT</pubDate></item></channel></rss>