The document discusses domain modeling using UML class diagrams and CRC (Class Responsibility Collaborator) cards. It explains that a domain model illustrates conceptual classes in the problem domain, rather than software components. It provides steps for creating a domain model, such as identifying candidate conceptual classes and drawing them in a UML diagram with necessary associations. CRC cards are also described as a way to discover classes, responsibilities, and collaborators by writing each on an index card.
The document discusses domain modeling using UML class diagrams and CRC (Class Responsibility Collaborator) cards. It explains that a domain model illustrates conceptual classes in the problem domain, rather than software components. It provides steps for creating a domain model, such as identifying candidate conceptual classes and drawing them in a UML diagram with necessary associations. CRC cards are also described as a way to discover classes, responsibilities, and collaborators by writing each on an index card.
The document discusses domain modeling using UML class diagrams and CRC (Class Responsibility Collaborator) cards. It explains that a domain model illustrates conceptual classes in the problem domain, rather than software components. It provides steps for creating a domain model, such as identifying candidate conceptual classes and drawing them in a UML diagram with necessary associations. CRC cards are also described as a way to discover classes, responsibilities, and collaborators by writing each on an index card.
and CRC cards CSE432 Prof Glenn Blank What is a Domain Model? Illustrates meaningful conceptual classes in problem domain Represents real-world concepts, not software components Software-oriented class diagrams will be developed later, during design A Domain Model is Conceptual, not a Software Artifact Sale amt item SalesDatabase Sale Double amt; Item item; void print() Conceptual Class: Software Artifacts: vs. Whats the difference? Domain Model Relationships Domain Model Use Case Model Interaction Diagrams Glossary Dynamic Behavior Functional Requirements Conceptual Class Diagram Classes, attributes, associations Domain objects Define terms What do you learn about when and how to create these models? Identify conceptual classes from noun phrases Vision and Scope, Glossary and Use Cases are good for this type of linguistic analysis However: Words may be ambiguous or synonymous Noun phrases may also be attributes or parameters rather than classes: If it stores state information or it has multiple behaviors, then its a class If its just a number or a string, then its probably an attribute From NPs to classes or attributes The ATM verifies whether the customer's card number and PIN are correct. S V O O O If it is, then the customer can check the account balance, deposit cash, and withdraw cash. S V O V O V O Checking the balance simply displays the account balance. S O V O Depositing asks the customer to enter the amount, then updates the account balance. S V O V O V O Withdraw cash asks the customer for the amount to withdraw; if the account has enough cash, S O V O O V S V O the account balance is updated. The ATM prints the customers account balance on a receipt. O V S V O O Analyze each subject and object as follows: Does it represent a person performing an action? Then its an actor, R. Is it also a verb (such as deposit)? Then it may be a method, M. Is it a simple value, such as color (string) or money (number)? Then it is probably an attribute, A. Which NPs are unmarked? Make it C for class. Verbs can also be classes, for example: Deposit is a class if it retains state information
R R M M A A A A A A A A A A A A A A C C R M R Consider the following problem description, analyzed for Subjects, Verbs, Objects: C Steps to create a Domain Model Identify candidate conceptual classes Draw them in a UML domain model Add associations necessary to record the relationships that must be retained Add attributes necessary for information to be preserved Use existing names for things, the vocabulary of the domain
8 Monopoly Game domain model (first identify concepts as classes) Monopoly Game Player Piece Die Board Square Monopoly Game domain model Larman, Figure 9.28
Discovering the Domain Model with CRC cards (See multimedia from The Universal Machine on CRC cards: umwords) Developed by Beck and Cunningham at Tektronix See http://c2.com/doc/oopsla89/paper.html This is the same Kent Beck that later wrote the book pioneering Extreme Programming (XP) CRC cards are now part of XP Low-tech Ordinary index cards Each card represents a class of objects. 3x5 is preferable to 4x6 at least early on Why? Each card has three components Name, Responsibilities, Collaborators
Responsibilities Key idea: objects have responsibilities As if they were simple agents (or actors in scenarios) Anthropomorphism of class responsibilities gets away from thinking about classes as just data holders Object think focuses on their active behaviors Each object is responsible for specific actions Client can expect predictable behaviors Responsibility also implies independence: To trust an object to behave as expected is to rely upon its autonomy and modularity Harder to trust objects easily caught up in dependencies caused by global variables and side effects. Class names Class Name creates the vocabulary of our analysis Use nouns as class names, think of them as simple agents Verbs can also be made into nouns, if they are maintain state E.g., reads card suggests CardReader, managing bank cards Use pronounceable names: If you cannot read aloud, it is not a good name Use capitalization to initialize Class names and demarcate multi-word names E.g., CardReader rather than CARDREADER or card_reader Why do most OO developers prefer this convention? Avoid obscure, ambiguous abbreviations E.g., is TermProcess something that terminates or something that runs on a terminal? Try not to use digits within a name, such as CardReader2 Better for instances than classes of objects Responsibilities section Describes a classs behaviors Describe what is to be done, not how! Use short verb phrases E.g.: reads card or look up words How do constraints of index cards guide class analysis? A good measure of appropriate complexity If you cannot fit enough tasks on a card, maybe you need to divide tasks between classes, on different cards? Collaborators Lists important suppliers and possibly clients of a class Why are classes that supply services more important here? Suppliers are necessary for the description of responsibilities As you write down responsibilities for a class, add any suppliers needed for them For example read dictionary obviously implies that a dictionary as a collaborator Developing CRC cards is first a process of discovering classes and their responsibilities People naturally perceive the world as categories of objects In object-oriented analysis, one discovers new categories relevant to a problem domain CRC card simulations Designing for responsibility involves simulation Objects model a world interacting behaviors After developing a set of CRC cards, run simulations AKA structured walkthrough scenarios -- Play what if to simulate scenarios that illustrate use of a system Let each person be responsible for simulating one or more classes Execute a scenario of classes performing responsibilities: Start a simulation with the construction of an object of a class, then perform one of its responsibilities (a behavior) A responsibility may pass control to a collaborator -- another class Simulation becomes visible as a sharing of responsibilities You may discover missing or incompletely described responsibilities See football example in multimedia IMO, it really should be called responsibility-driven analysis, rather than responsibility-driven design. Why? When is responsibility driven activity most useful? Class Diagram Notation Wars Early 90s: 6-10 different notations Bertrand Meyer: circles and arrows Distinguishes inheritance and client/supplier relationships Grady Booch: clouds, lines and decorations GardeningPlan Association- Environmental Controller Heater and Cooler Generalization/Specialization-> Actuator Environmental Controller -has a- Heater (Cooler, Light) Actuator o using Temperature (client/supplier) Actuator is an abstract class (A in a triangle) Peter Coad, Ed Yourdon & Jill Nicola: Rounded boxes and annotated lines Line bisected by semi-circle represents generalization Line bisected by triangle represents whole/part So, whats your reaction to all these (and more) notations? Cant we all get along? Hence three amigos create UML in mid-90s
Closer look at Coad & Nicola Two different boxes grouping classes: HIC (Human Interaction Component) PDC (Problem Domain Components) Why is Separation of Concerns principle a good idea? First person scenarios: Coad & Nicola call this the "I'm alive principle": Objects can be better understood by thinking about them and talking about them in the first person: "I know my own ____ and I can ___ myself." What goes in the blanks? Attributes and behaviors Why is putting these scenarios in the first person a good idea? Object-think: objects are autonomous, perform behaviors Similarly, Kent Beck talks about the need for anthropomorphism in responsibility-driven design
Class diagrams in UML Classes are boxes, lines are associations Add decorations to lines to refine them But before we study the decorations. A heuristic for class diagram design Don't put any decorations on the associations at first Semantics of relations tends to be vague Is a" relationship can mean SUBTYPE ("a square is a polygon") or INSTANCE-OF ("George is a square") or IDENTICAL-TO ("The morning star is the evening star") or PROPERTY-OF ("A circle is a round object") or ROLE-OF ("George is a President") or MADE-OF ("My house is a brick one") or simply EXISTS (To be or not to be"). In many languages, there is no verb "is" at all, or its rarely used. Let the meaning of relations emerge from what they relate Vagueness is natural: start off vague, get more specific gradually UML supports this heuristic by starting with simple undirected lines (associations) Later, add detail to your relationship structures Two basic relationships of O-O OOA typically distinguishes two relations: is-a and has-a Why two? Thats what O-O programming languages implement: Smalltalk and Java: instance variables and inheritance C++: data members and class derivation Meyer calls these inheritance and client/supplier Booch: generalization/specialization and association or aggregation or composition Coad and Yourdon: gen/spec and whole/part UML calls these generalization and association or aggregation or composition Associations A link between two classes (has a) Typically modeled as a member reference Notation from Extended Entity Relation (EER) models A Person works for a Company
Role names and multiplicity at association ends Direction arrow to aid reading of association name Person Company employee employer works for Association Name Role 0..* 1 Generalization / Specialization Classes may be subclasses of other classes a kind of or is a Cars are a kind of vehicle (Or a car is a vehicle) Chairs are a kind of furniture People are a kind of mammal Generalization captures commonality: What do cars have in common with vehicles? Same properties and behaviors UML: generalization/specialization relationship Drawn as a line with an arrow head on one end Inheritance in OO programming languages
Generalization Example Mammal Puma Tiger Feline Quadruped Lion Lizard Advantages of Inheritance? GrainStore grainType : String grainGrade : String capacity : int quantity : int add( amount : int, type : String, grade : String ) remove( amount : int ) getType() : String getGrade() : String getCapacity() : int getQuantity() : int RailCar Silo Truck OOP = Data abstraction + inheritance + dynamic binding (polymorphism) Polymorphism: a function can do different behaviors at runtime Dynamic binding: delay function binding to a subtype until runtime Suppose we want to draw a heterogeneous collection of shapes? class Point { ... }; //a Point has x and y coordinates class Shape { protected: //accessible to subclasses but otherwise private Point center; //all Shapes have a center Point public: Point where() { return center; } //early binding by default virtual void move(Point to) //can override virtual function { center = to; draw(); } // by derived classes virtual void draw()=0; //=0 is a "pure" virtual function //draw() must be implemented by derived classes //... }; //Why do we say Shape is an abstract class? Subclasses override virtual functions class Triangle: public Shape { Point sw, se, top; //Three points define triangle public: Triangle(Point a, Point b, Point c) : sw(a), se(b), top(c) {} draw() //implementing pure virtual function { put_line(sw,top); //draw line from sw to top put_line(top,se); //draw line from top to se put_line(se,sw); //draw line from se to sw } }; class Circle : public Shape { int radius; public: Circle(Point a, int r) : center(a), radius(r) {} draw(); //draw a circle using center and radius }; Calling a virtual function { //Construct some shapes Shape aShape; //illegal--why? Circle c(Point(20,30),7); //legal--what does it do?
//Create an array of various shapes Shape* shapes[10]; //Why is this legal? shapes[0] = new Circle(Point(20,30),7); //assign a Circle shapes[1] = new Triangle(Point(50,50),Point(30,30),Point(40,40)); //... maybe assign other shapes, Rectangles, Squares, etc.
for (int i=0; i < 10; i++) //draw all the shapes shapes[i]->draw(); //each shape draws itself! } Why do we say that elements of shapes array are polymorphic? Polymorphic design supports B. Meyers Open-Closed principle: A module should be open to extension but closed to modification So important that its built into most OO programming languages Why dynamic binding? What kind of code does dynamic binding avoid? Avoids lots of switch statements, e.g.: switch (shapes[i]->isa) //each Shape derived class has an isa data member { case(triangle) Triangle::draw(); //test enumeration case(circle) Circle::draw(); //run specific draw() // ... } Why is the dynamic binding version better for big, growing programs?
Many design patterns build on polymorphism Five activities of OOA Coad, Yourdon and Nicola: 1) Class-&-object: describe problem domain in terms of classes of objects 2) Structure: describe relationships between classes 3) Subject: organize classes into clusters or packages 4) Attributes: describe data held by objects 5) Services: describe behaviors that objects can perform Which of these five activities are analysis and which are design? Concrete and abstract classes Identifying classes is 1st activity of domain analysis Remember the linguistic analysis technique Can ignore inheritance and polymorphism for first draft, then factor out commonality as superclasses An abstract class has one or more operations that must be implemented by subclasses UML represents an abstract class by italicizing the class name or adding the constraint label {abstract}
Structure (association) analysis Lines connecting classes In UML, simple line is an association Decorations for multiplicity, role names, constraints See example from Fowler What does {ordered} constraint mean? Aggregations and composition: Arrow denotes navigability e.g., Polygon and Circle refer to Point but not vice versa A black-filled diamond denotes a composition a part, unique to this whole A white-empty diamond denotes an aggregation a part, but not unique to this whole E.g., A Point may appear in only one Polygon or Circle but a Style could appear in both An alternative notation for composition in boxes Attributes and operations A class box may have three parts Class name, attributes and operations Attributes in middle section Typically attributes are built-in types UML lets you include information about default values and visibility (+,-,#) E.g., - name: String [1] = Untitled {readonly} private : type multiplicity default {property} (unmodifiable) I recommend you hold off on these details until design Operations in bottom section of class box Represent services, functions or methods Again, UML has a bit more notation, for information about parameters, default values and visibility E.g., + balanceOn(date:Date): Money Again, I recommend you hold off on these details until design Eclipse with plug-ins Open Source IDE for O-O and Java Plug-ins add more features DrJava plug-in provides Java interpreter Plug-in adds UML class diagrams Available on campus by running eclips Also available for download: http://www.lehigh.edu/stem/teams/dieruff (3.0)