Principles, Patterns and Practices
of Object-Oriented Java Programming

Course Outline

Day 1

Coding for Readability and Maintainability

The Problems

The Objectives

Forms of Software Rot

Attributes of a Good Design

Clean Code Qualities

Professional Responsibilities

Automated testing, TDD and Refactoring Practices Review

Refactoring

Exercise

 

Single Responsibility Principle

Problem addressed by SRP

Example design violating SRP

Example design conforming to SRP

Patterns built on SRP

Exercise

 

Day 2

Dependency Inversion Principle

Problems with Procedural Programming

Object-Oriented Programming

Problem addressed by DIP

The Dependency Inversion Principle

Dependency Inversion Heuristics

When is DIP appropriate/inappropriate

Example design violating DIP

Example designs conforming to DIP

Exercise

 

Open/Closed Principle

Problem addressed by OCP

The Open/Closed Principle

When is OCP appropriate/inappropriate

Several Example designs violating OCP

Several example designs conforming to OCP

Exercise

 

Liskov Substitution Principle

Problem addressed by LSP

The Liskov Substitution Principle

Example designs violating LSP

Example designs conforming to LSP

Relationship OCP/LSP

When is “instance of is” not an LSP problem

Exercise

 

Day 3

Interface Segregation

Problem addressed by ISP

The Interface Segregation Principle

Example designs violating ISP

Example designs conforming to ISP

When is ISP appropriate/inappropriate

Exercise

 

Law of Demeter

Problem addressed by LoD

Example design violating LoD

Example designs conforming to LoD

When is LoD appropriate/inappropriate

Pro/Con discussion

Exercise

 

Packaging Cohesion Principles

Problem being solved by package cohesion principles

Package Cohesion Principles

The Reuse-Release Equivalency Principle

The Common Closure Principle

The Common Reuse Principle

Relationship between cohesion principles

Relationship to class design principles

Exercise

 

Day 4

Packaging Coupling Principles

Problem being solved by Packaging Coupling Principles

Packaging Objectives

Package Coupling Principles

The Acyclic Dependencies Principle

The Stable Dependencies Principle

The Stable Abstractions Principle

Exercise

 

Practices That Support the Principles

Simple Design

Automated Testing

Test-Driven Development

Refactoring

Teamwork

Pair Programming

Collective Ownership

Quick Design Sessions

Continuous Integration

Code/Design Reviews

 

Summary

Clean code

Professional Responsibilities

SOLID Principles

Packaging Principles