//****************************************************************************// //************ Class Diagrams (cont.) - October 11th, 2017 ******************// //**************************************************************************// - Welcome back from fall break! We'll go over the last few squiggly lines for class diagrams in UML, and then move onto sequence diagrams - "For reading in the data...I won't be grading based on performance at all. If this were a real app, you'd be using database techniques and using multithreading to load the stuff in the background...I'm not expecting anything like that, but keep in mind that industrial-grade apps would be using techniques like this." - "And remember, the UML Class Diagrams are NOT just Domain Models; in Class Diagrams, we INCLUDE things the customer doesn't need to know about, like interfaces, databases, abstract classes, etc." ------------------------------------------------------- - To show ABSTRACT classes, you either write the name of the class in italics, OR write "{abstract}" (in curly brackets) above the abstract's classname - "Why we don't use '<<>>' like for stereotypes, I'm not quite sure" - To show ENUMS in class diagrams, we write "<<enumeration>>" over the enum's name, then write all the enum's states underneath it (e.g. Sunday, Monday, Tuesday, Wednesday, etc...) - "To show that a class uses an Enum, we draw a line from the enum to the implementing class w/ 'has' written over it, OR we write the enum as a variable on the class" - Do NOT draw a line to the class AND include it as a variable; this counts as a "double declaration", and WILL be counted as incorrect - Let's say we have a "Customer" class that can check out a "Book" object, with information about when the book was checked out, potential fines, etc.; where should that data go? On the Customer? On the Book? -..., really, it belongs on the "CheckOut" object itself! So, we should put this data on an "association class", drawing a dashed line from the line connecting 2 classes - How exactly these objects are tracked/created is implementation-specific; we could have an array of "CheckOut" objects on the Customer class, we could have a "Manager" class that keeps track of them, etc. - Finally, there's an idea called "Active Classes" w/ double-walls to show which classes are always running, which are thread-dependent, etc...we won't really use them in this class, but you should be aware of them for later on in your coursework - "There are a few more rules for drawing class diagrams, but those can get a bit esoteric, so we won't worry about them in this class" - So, let's say we have our Library domain model with our "User" object (Name, ID), "Book" object (ISBN, name), and the "ChecOut" association object between them (User, Book, Data); to turn this into a Class Diagram, one way would be: - Create a "User" class, with data "Name(String)" and "ID(int)" - Create a "BookCopy" class (since we could have multiple copies of the same book), with a "Book(Book)" reference and a "CopyNum(int)" attribute - We would have our "CheckOut" object between these 2 classes - We'd have a "Book" class for each book we have in the library, with a "Name(String)", "ISBN(int)", "Author(Author)", etc. -Since we, say, want the user to be able to search for books by Author, we create a separate "Author" object, with a "Name(String)" property and "Books(Array)" array of books they've written - This way, when searching by author, we can just look the Author up in a hash table and get all their books, instead of iterating through all of our books and then filtering by author -...annnnnnnnnddddd that's class diagrams! - So, let's move onto SEQUENCE DIAGRAMS - "For whatever reason, these are the ones that students tend to have the most trouble with" - This is the last diagram we'll do in this class, but for reference, other common UML diagrams are State Diagrams (for FSMs), Activity Diagrams (like flowcharts), etc. - To write the sequence exam for an activity, we write the names of the classes involved in the event across the top, as separate boxes - We then draw the "User" (or whoever starts the activity) to the left of all the boxes; we then draw a dotted line from ALL of the object across the top down to the bottom of the page - -e.g. Let's say we had a Sequence Diagram for the "Login" activity - We would have, from left-to-right, a "User" figure, then boxes for the "LoginAct", "Model", and "User" class - Ater drawing the dashed "lifelines" to the bottom, we would draw an "onClick" arrow from the User's line to the "LoginAct" line ...annnnnnnd we'll wrap this up on Friday!