<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="course.xsl"?>

<course designator="CSC407H">
    <title>Software Design and Architecture</title>
    <alias>CSC2103H</alias>
    <alias>ECE450H</alias>

    <owner>David A. Penny<e-mail>penny@cs.toronto.edu</e-mail></owner>
    <instructor term="fall" year="2001" section="1" name="Dave Penny"/>
    <instructor term="spring" year="2002" section="1" name="Dave Penny"/>
    <instructor term="spring" year="2002" section="2" name="Mathew Zaleski"/>

    <calendar-description>
	An introduction to the development of system-level architectures
	and class-level object-oriented designs for software systems.
	This course places special emphasis on the study of architecture and design patterns:
	the core of solutions to commonly occurring design problems.
	Other topics include representations of design/architecture
	(with emphasis on the use of UML as a class-level design notation),
	architectural assessment,
	product lines,
	architecture extraction,
	and re-factoring.
	The course does not have a major project,
	but does have a series of smaller design and architecture exercises requiring some programming.
	A knowledge of <b>UML</b> as used for requirements analysis and a working knowledge
	of both the C++ and Java languages is assumed. 
    </calendar-description>

    <additional-description>
	Even once we fully understand the requirements for a software system
	it is rarely clear how to begin the programming task
	(except for the most trivial of programs).
	The steps in-between requirements and coding are first architecture and then design.
	Architecture involves specifying the construction of the system at the highest level.
	What are the major modules?
	What are the major processes?
	How do the processes communicate with one another?
	Design involves specifying the construction of a single module or program at the class level.
	What classes should we have?
	What are their responsibilities?
	With what other classes should they collaborate?
	What methods should they contain? 
	This course teaches students how to come up with and then descirbed
	system-level architectures and class-leve designs.
    </additional-description>

    <prereq>
        CSC340H
	<reason>teaches UML for OOA</reason>
	<reason>Good to understand requirements before design</reason>
    </prereq>

    <prereq>
        CSC378H
	<reason>teaches ADTs so that students have a solid understading of encapsulation</reason>
	<reason>to get past this course, students must have gone through Java and C++</reason>
	<reason>general programming maturity</reason>
    </prereq>

    <prereq>
        CGPA 2.00
    </prereq>

    <goal>
	Learn to be better software architects and designers
	<goal>Learn to represent an OOA using UML</goal>
	<goal>Learn the process of doing an OOA</goal>
	<goal>Learn to represent an OOD using UML</goal>
	<goal>Learn the process of doing an OOD</goal>
	<goal>learn how to learn patterns</goal>
	<goal>Learn the GofF design patterns</goal>
	<goal>Learn how to represent a system architecture (informally)</goal>
	<goal>Learn a standard set of architectural patterns</goal>
    </goal>

    <topic hours="1">
	Introduction to software architecture and design
	<topic>the place of design and architecture in the software development process</topic>
	<topic>definition of architecture</topic>
	<topic>the importance of architecture</topic>
	<topic>architecture process steps</topic>
	<topic>architecture process steps</topic>
	<topic>quality attributes affected by architecture</topic>
	<topic>the existence of multiple architectural structures in software</topic>
    </topic>

    <topic hours="1">
	The roots of modularity and information hiding
	<topic>Parnas paper: KWIC case study</topic>
    </topic>

    <topic hours="1">
	Introduction to Object-Oriented Design
	<topic>Coad and Yourdon OOD process steps</topic>
    </topic>

    <topic hours="10">
	Design patterns
	<topic hours="1">
	    Introduction
	    <topic>purpose of design patterns</topic>
	    <topic>how design patterns are described</topic>
	    <topic>a taxonomy of design patterns</topic>
	    <topic>using design patterns</topic>
	    <topic>inheritance, composition, and delegation</topic>
	</topic>
	<topic hours="3">LEXI case study</topic>
	<topic hours="6">Detailed description of selected patterns</topic>
    </topic>

    <topic hours="9">
	System-Level Architecture
	<topic hours="1">guest lecturer from industry</topic>
	<topic hours="2">monolithic systems</topic>
	<topic hours="1">components (e.g., JavaBeans)</topic>
	<topic hours="2">client/server systems</topic>
	<topic hours="1">RDBMS-based systems</topic>
	<topic hours="1">distributed objects (e.g., CORBA, EJB)</topic>
	<topic hours="1">n-tiered systems</topic>
    </topic>

    <topic type="optional">architecture assessment</topic>
    <topic type="optional">product lines</topic>
    <topic type="optional">architecture extraction</topic>
    <topic type="optional">architecture re-factoring</topic>
    <topic type="optional">architecture description languages</topic>

    <text type="required">
	<title>Design Patterns: Elements of Reusable Object-Oriented Software</title>
	<author>Gamma et. al.</author>
	<publisher>Addison-Wesley (Professional Computing Series)</publisher>
	<year>1995</year>
	<edition>1st</edition>
	<ISBN>0-201-63361-2</ISBN>
    </text>

    <text type="reference">
	<title>The Unified Modeling Language User Guide</title>
	<author>Booch et. al.</author>
	<publisher>Addison-Wesley</publisher>
	<year>1998</year>
	<edition>1st</edition>
	<ISBN>0-201-57168-4</ISBN>
    </text>

    <tech>UNIX</tech>
    <tech>Java</tech>
    <tech>UML (for design)</tech>
    <tech type="optional">UML Drawing Tool (e.g., Rational Rose)</tech>

    <eval type="assgnment" weight="20%">
        given a simple problem, come up with a class design in UML using patterns and then code it in Java
    </eval>

    <eval type="assignment" weight="20%">
        given a more advanced problem, come up with a class design in UML using patterns and then code it in Java
    </eval>

    <eval type="assignment" weight="20%">
        given the description of a system's requirements, produce a system-level architecture document for it 
    </eval>

    <eval type="exam" weight="40%"/>
</course>
