Skip to main content

Software Design and Programming


Module description

In this module we provide you with the necessary skills for developing software using object-oriented and functional programming paradigms. This ranges from learning object-oriented concepts, designing object-oriented software using a proven methodology and tools, to learning how to program in an object-oriented and functional style. We will also examine software design patterns and the emerging functional features of current day object-oriented programming languages (e.g. Java).

Indicative syllabus

  • The object model and how it is realised in object-oriented languages (e.g. Kotlin, JavaScript, C#, Java, Scala, Swift)
  • Further development of the ideas of inheritance, polymorphism and abstraction
  • Language features: abstract data types, static typing and type inference, polymorphic types, nested classes, meta-objects, etc
  • Imperative features: signatures, structures, recursion and induction
  • The functional paradigm: closures, higher-order functions, stream processing, eager and lazy evaluation
  • The SOLID principles (Single responsibility, Open-closed, Liskov substitution, Interface segregation and Dependency inversion) approach to object-oriented programming and design
  • Design patterns and anti-patterns and their application to software design
  • Leveraging concurrency and asynchronous processing
  • The use of an integrated development environment (IDE) for software development, e.g. editing, debugging, compilation and the build process
  • Test-driven development (TDD)
  • Code refactoring and analysis
  • Modularity, versioning and packaging

Learning objectives

By the end of this module, you will be able to:

  • write programs in an object-oriented and functional language
  • write appropriate unit tests and understand their place in the software development process
  • utilise object oriented and functional programming principles to create extendible and reusable software applications
  • design medium-scale applications
  • collaborate on team projects
  • review and critique software requirements
  • review software designs and code.