Code Quality Design Help

CS 236 Updated Course Content Outline (Fall 2025 Addendum)

If you have any concerns about teaching this updated material, contact Mark Van Gorp at mvangorp@jccc.edu.

SOLID Principles

Single Responsibility Principle (SRP)

  • Understand and apply the concept that a class should have only one reason to change.

Open-Closed Principle (OCP)

  • Grasp and utilize the notion that software entities should be open for extension, but closed for modification.

Liskov Substitution Principle (LSP)

  • Comprehend and employ the idea that objects of a derived class should be able to replace instances of the base class without affecting the correctness of the program.

Interface Segregation Principle (ISP)

  • Understand and apply the principle that clients should not be forced to depend on interfaces they do not use.

Dependency Inversion Principle (DIP)

  • Grasp and utilize the concept of depending on abstractions, not on concrete implementations.

Design Patterns

Strategy Pattern

  • Understand and apply the concept of defining a family of algorithms, encapsulating each one, and making them interchangeable.

  • Strategy lets the algorithm vary independently from clients that use it.

Decorator Pattern

  • Grasp and utilize the notion of adding new functionality to an object without altering its structure.

Factory Pattern

  • Comprehend and employ the idea of creating objects without specifying the exact class of object that will be created.

Unit Testing

Understanding Unit Testing

  • Grasp the basic principles and value of unit testing, and how it relates to good software design.

Writing Testable Code

  • Understand and apply practices that make code testable.

  • Discuss how well-designed code is inherently easier to test.

Creating and Running Unit Tests

  • Learn to write and run simple unit tests using frameworks like MSTest or NUnit.

  • Ensure that each part of the software behaves as it should.

Mocking and Stubbing

  • Delve into techniques for isolating code under test.

  • Create mock objects and understand the role of stubs.

Asynchronous Programming

  • Explain the concepts of asynchronous programming.

  • Discuss the role and usage of async and await keywords in C#.

  • Explore Task and Task<T> return types.

  • Discuss handling of exceptions in asynchronous programming.

  • Demonstrate usage of async and await in File I/O, database operations, and web services.

Immutability in C#

Discuss the Concept of Immutability

  • Discuss the concept of immutability and its benefits.

Explore C# Records and the init Keyword

  • Explore C# records and the init keyword for creating immutable objects.

Discuss the with Keyword for Non-Destructive Mutation

  • Discuss the with keyword for non-destructive mutation.

Utilize Immutable Collections

  • Utilize IImmutableList and other types in the System.Collections.Immutable namespace for creating immutable collections.

  • Demonstrate practical uses of immutability in C# code.

Introduction to Functional Programming

Discuss the Concept of Functional Programming

  • Discuss the concept of functional programming and how it differs from object-oriented programming.

  • Discuss the connection between functional programming and immutability.

Explore Side Effects and Pure Functions

  • Explore side effects and their impact in functional programming.

  • Discuss the principles of pure functions.

Demonstrate Functional Programming Concepts in C#

  • Demonstrate the usage of functional programming concepts in C#, including lambda expressions and LINQ.

20 August 2025