Checking Design Consistency and Completeness
Many teams start with CRC cards, sketching class responsibilities and collaborations on paper. The moment they draw a UML class diagram, they assume the model is complete. But here’s the truth: a diagram that looks correct often hides ambiguity, missing associations, or duplicated classes. The most misleading visual is one that follows syntax but ignores intent.
I’ve reviewed hundreds of UML class diagrams—many derived from CRC cards—where the structure is technically valid but fails in practice. The problem is not syntax. It’s design intent. A class may have proper attributes and methods, but if it doesn’t reflect real-world behavior or its relationships don’t align with domain logic, it’s a fragile model.
This chapter gives you a field-tested UML design review checklist. It’s built from years of mentoring teams through CRC to UML validation, teaching how to catch inconsistencies early. You’ll learn how to verify class model completeness, detect hidden duplication, and align relationships with actual system behavior—without overcomplicating the process.
Why Consistency Checking UML Matters
UML isn’t just about drawing boxes and lines. A well-formed diagram should reflect the real-world domain, not just follow grammar rules. Misaligned associations or ambiguous multiplicities can lead to runtime errors, poor maintainability, or misunderstood requirements.
During CRC-to-UML validation, teams often assume that if a class is mentioned in multiple cards, it must be in the model. But that’s not enough. The real test is: does the class interact in ways that match the domain? That’s where consistency checking UML becomes essential.
Consider this: a “Customer” class might appear in both a “Billing” and “Order” card. That suggests a role in two processes. But if the association isn’t properly modeled with navigability and multiplicity, the system might incorrectly assume that every order must have a customer—but what about anonymous orders? That’s a design gap hiding in plain sight.
UML Design Review Checklist: 8 Critical Checks
Use this checklist during design reviews, especially after converting from CRC cards to a formal class diagram. Go through each item systematically. If any check fails, pause and investigate.
- Check for duplicate classes. Review all class names. Are there two classes with similar names (e.g., “User” and “Customer”) that might represent the same concept? Use domain logic to determine if they’re truly distinct or if one should be refactored.
- Verify all CRC responsibilities are mapped. Every responsibility from the CRC cards should appear as a method or attribute in the UML class. If a role like “calculate total” is missing, reassess the model’s completeness.
- Validate associations and multiplicities. Ensure every collaboration from CRC cards is represented as an association. Check that multiplicity (e.g., 1..*, 0..1) reflects the actual business rule. Ask: “Is this cardinality realistic in the domain?”
- Confirm navigation is intentional. If an association is navigable from Class A to Class B, ask: “Would the system logic typically start from A to find B?” If not, reconsider the direction or consider removing the navigability.
- Review inheritance and abstraction. Are shared responsibilities abstracted into a superclass or interface? If two classes have nearly identical methods, ask: “Is this a case for inheritance or an interface?” Avoid deep hierarchies unless justified.
- Ensure no orphaned or unused classes. Remove any class that doesn’t participate in any association or responsibility. If a class exists but isn’t used, it’s likely a leftover from brainstorming or a misinterpretation.
- Check attribute types and constraints. Attributes should be typed appropriately (e.g., not “string” for a date). If a constraint exists in the domain (e.g., “Order total must be > 0”), ensure it’s modeled via constraints or validation rules.
- Verify visibility and encapsulation. Public methods should be justified by external collaboration. Private methods should remain internal. If a method is public but rarely used, consider if it’s a design smell.
Class Model Verification: A Step-by-Step Process
To make this more actionable, here’s a workflow I use in team design sessions:
- Start with the original CRC cards. Re-read every class, responsibility, and collaboration.
- Map each CRC responsibility to a UML method or attribute. Use a simple table to track mappings.
- For each collaboration, draw the corresponding association. Ensure both ends are correct.
- Ask: Does this relationship reflect a real dependency or interaction? If not, reevaluate the link.
- Run the model through the checklist above. Highlight any failures.
- Hold a 15-minute review with a peer. Explain the model aloud. If you struggle, the model is likely incomplete.
Quick Reference: CRC-to-UML Mapping Table
| CRC Element | UML Equivalent | Verification Tip |
|---|---|---|
| Class name | Class in UML | Check for naming consistency. Avoid “Manager” and “Supervisor” unless they’re distinct roles. |
| Responsibility (e.g., “calculate total”) | Operation (method) | If it returns a value, mark it as “return type.” If it doesn’t return, mark it as “void.” |
| Collaboration (e.g., “uses Order”) | Association (with multiplicity) | Ask: “Does A always need B? Is B optional? Use 1, 0..1, 1..*, etc.” |
| Attribute (e.g., “has name”) | Attribute | Ensure type matches domain (e.g., “String” for name, “Date” for birthday). |
Common Pitfalls in CRC to UML Validation
Even experienced teams make the same mistakes. Here are three I’ve seen repeatedly:
- Overloading with associations. A single class showing 15 associations is a red flag. Ask: “Is this class a hub, or is the model too granular?” Consider introducing a new abstraction.
- Ignoring cardinality. A “Customer” to “Order” relationship might be 1..* at both ends. But in reality, a customer can have many orders, but an order belongs to exactly one customer. This is a violation of business logic.
- Forgetting about constraints. A “Payment” class might have a “status” attribute but no constraint on valid values (e.g., “Pending,” “Completed,” “Failed”). Add a constraint like {valid values: Pending, Completed, Failed}.
Practical Tips for Teams
When working in groups, assign each member one CRC card to map. Then, compare outputs. Discrepancies reveal where the team’s understanding diverges. Use these differences to open discussion, not to blame.
Always keep the domain model in mind. Ask: “Would a business expert recognize this as a real process?” If not, simplify or reframe.
Use diagrams not as final artifacts, but as collaboration tools. A model is only complete when it’s not just correct—but understandable.
Frequently Asked Questions
How do I know if my class model is complete?
It’s complete when every CRC responsibility and collaboration maps to a method, attribute, or association. No card should be left unaccounted for. Run the checklist, and if all items pass, the model is likely complete.
What should I do if two classes have the same name but different responsibilities?
That’s a sign of potential misclassification. Re-evaluate the domain. If they’re not distinct roles, consolidate. If they are, add context in the name (e.g., “Customer” vs. “BillingCustomer”) or use a different domain concept.
Is it okay to have a class with no associations?
Only if it’s a data carrier (e.g., “Address”) with no behavior. If a class has responsibility but no associations, it’s likely incomplete. Revisit the CRC card to see who it collaborates with.
How do I handle ambiguous associations?
Ask: “Does this association reflect a real dependency, or is it speculative?” If you can’t explain the interaction in plain language, the association may not be needed. Remove it and re-evaluate.
Should I refactor my model after a design review?
Absolutely. A review isn’t about perfection—it’s about improvement. Use the checklist to identify weak spots. Refactor not for aesthetics, but for clarity and correctness. This is part of the class model verification cycle.
What if my team disagrees on a relationship or multiplicity?
Use the CRC cards as a reference. Re-read the collaboration. Ask: “Who depends on whom?” If consensus still fails, simulate a scenario (e.g., “What happens if a customer is deleted?”) and let the behavior guide the model.