s5cs39 object oriented programming
This page is mainly about s5cs39 object oriented programming
This section is about programming paradigms and how to program using objects and, to be honest, is probably one of the most important sections in this year since all the other programming stuff uses the concepts you will learn here. Pay attention!
We are learning ...
About different programming paradigms
About the concepts of Object Oriented Programming
Practical methods of creating and managing objects
So that we can ...
List / describe examples of and the need for different programming paradigms
Understand the specific characteristics of object oriented programming paradigms
Be familiar with the concept of
- Class
- Object
- Instantiation
- Encapsulation
- Inheritance
- Public, private and protected specifiers
- Polymorphism
- Aggregation (association and composition)
- Overriding
- Abstract, virtual and static methods
Be familiar with OOP design principles
- Encapsulate what varies
- Favour composition over inheritance
- Program to interfaces, not implementation
Write object oriented programs
Draw and interpret class diagrams
- Single inheritance
- Public, private (-) and protected (#) specifiers
Activity 1 What is a programming paradigm (and can I use some)?
In a nutshell, a programming paradigm (pronounced 'paradime') is a fundamental style of computer programming, a way of building the structure and the individual elements of computer programs.
Task 1.1 Paradigm Shift
World Wide Web
What are the major programming paradigms? Unfortunately, there is no definitive list or definition. Using the following Wikipedia article, research the following programming paradigms ...
Imperative
Structural
Procedural
Event Driven
Declarative
Functional
Object Oriented
You should attempt to come up with a definition, example and application of each programming paradigm. The ones in bold are considered by some to be the main programming paradigms. What is your view (if you have one)?
OUTCOME : A table containing a summary of each programming paradigm.
So, where are there so many programming paradigms? Why might we want to cook an egg in so many different ways?
Imperative programming
Describes step by step exactly the procedure to be followed in order to solve a problem. The efficiency of the solution depends on the experience and skill of the programmer in determining the algorithm to solve the problem.
Task 1.2 Code examples
World Wide Web
Find some actual code examples from the following imperative programming languages.
FORTRAN
COBOL
Pascal
BASIC
What are the common features of each language?
OUTCOME : Four short scripts, one for each imperative language including a statement of how they are similar.
Declarative programming
Describes the problem to be solved but does not specify the method of reaching the solution (control flow). It is up to the language to determine the best method of reaching the solution. There is a free declarative programming environment called SWI-Prolog which is available as a standard installer or a portable app.
http://www.swi-prolog.org/
Click to visit SWI-Prolog Website
Task 1.3 Adventure game
You have actually already used a declarative programming language if you have done any work with SQL. However, how about something a little more challenging? Strictly, you don't really need to do this, but it's a bit of fun and might give you some ideas for a project ...
Make sure you have access to SWI Prolog
If you haven't already, download SWI Prolog from the official website. When you run it, you will be presented with a REPL (a little like IDLE). Don't try to use it without ...
Download and follow the tutorial
Download Logic Programming tutorial save this in a suitable place in your documents. Spend at least an hour following this tutorial - there are lots of new and exciting things to learn. Take your time.
Play the adventure game!
When you reach the end of the tutorial, you will find an old style, text based adventure game! Feel free to type it in or you can download Adventure Game instead. Play the game, but, try not to peak at the script - you will find the answer in there if you look carefully!
OUTCOME : A happy office worker and a little knowledge about declarative programming. Oh, and a print out of the Adventure game for your notes.
Functional programming
Treats problems like mathematical functions and solves them using a variety of mathematical techniques. These are actually considered a subset of declarative languages. One of the most common functional programming languages is Haskell. It's hard.
https://www.haskell.org/
Click to visit the Haskell homepage
Task 1.4 Haskell in the browser
The official Haskell website has a tutorial on the homepage. A simpler version of this is on the Try Haskell website. All you need to do is type help at the prompt and follow the instructions to get some experience of what a functional programming language is.
OUTCOME : Nothing specific, just experience.
However, if you are studying the AQA exam board specification, you will be learning about Functional Programming in a future topic! Looking forward to that!
So, what's the difference?
As we are focusing on Object Oriented Programming, let's compare the same problem solved using a simple, structured and an object oriented approach. Enter the chatbot!
https://drive.google.com/file/d/0B83yXMOilskabXdtY0E0YnBjSjg/view?usp=drive_web
Click to enlarge
You can download the scripts from the lesson resources - have a play. Which one (if any) do you prefer? What's the advantage of the Object Oriented Version? It doesn't seem obvious ... yet.
Activity 2 Thinking objectively
The other programming paradigms are all well and good, but they don't seem to naturally model the real world. Object Oriented Programming, however, is designed to do just that. The main difference between imperative / structural programming and object oriented programming is that, in structural programming, the lines of code and the data on which they operate are stored separately. An object oriented program puts the data and the processes that can be carried out on that data in one place. We can also place restrictions on how the data can be manipulated by the code.
Think about it, the world is made from ...
(objects)
The following video is quite old but still gives the right messages about Object Oriented Programming (and explains lots of the key terms). There is a particularly funny bit at 7:50s ...
Beginner Developer Learning Center
During the AS Course, we studied a topic called 'How to solve it, better'. In this we discussed basic concepts of Object Oriented Design - Information hiding, encapsulation and interfaces.
Task 2.1 Recap
Visit How to solve it, better and find the section on Information hiding, encapsulation and interfaces. Write three quick definitions in your books, one for each of these three concepts.
OUTCOME : Three definitions for information hiding, encapsulation and interface.
Objects are defined by their class. Objects encapsulate the properties and methods of the class. It's the properties and methods that make objects in the class similar. The values of the properties describe the differences between each instance of an object.
Task 2.2 Pet Caretaker
As a learning exercise, it's always a good idea to look at a real example. In this script, we will create a virtual pet of the Tamagotchi style.
Download a copy of the class
Download the petCaretaker class definition and execute it in IDLE. Your teacher will provide you with a printed copy of it and take you through the script and explain how it works.
During the demonstration
You should follow the examples your teacher shows you. Write notes on the printout of the class to describe it's operation if you need to.
After the demonstration
You should write notes to explain the meaning of the following features of OOP ...
Instantiating an object from a class definition
Class / static attributes and static methods
Constructors (__init__)
Attributes / properties
Accessor methods (ways of retrieving and modifying attributes)
Private / Public attributes and methods
Ways of protecting the class / ensuring integrity / encapsulation
An 'interface' and what it's used for
OUTCOME : An annotated script for the petCaretaker.py class and a set of notes explaining key ideas.
Inheritance and Polymorphism
The power of OOP comes from the fact that we can define one class and base other classes on it using the concepts of inheritance and polymorphism.
Inheritance describes the way in which a subclass takes on (or inherits) the properties and methods of its parent class. We can use an inheritance diagram to represent this relationship. The inheritance diagram shows the name of the class, its properties, it's methods and it's relationship to other classes in the hierarchy. Notice the open arrows ...
The following simplified inheritance diagram shows the relationship between abstract classes (animal, reptile, mammal and feline) and concrete classes (lion, tiger, bear, snake). It is not usual to create (or instantiate) objects from abstract classes since we would never, for instance, see a generic reptile wondering around, would we?
The arrow should be read as an 'is a' relationship. For instance ...
"The Bear is a Mammal"
https://drive.google.com/file/d/0B83yXMOilskaWk9TcHF0U1NDLXc/view?usp=drive_web
Click to enlarge
[need up update to change arrows to open rather than closed]
Each time your create a new class which inherits from another, it should become a more specific example of that object. Inheritance shouldn't add complexity.
Polymorphism (literally, 'taking on many shapes') describes the way in which the same method is implemented differently in different subclasses. For instance, all animals makeNoise() but the implementation of makeNoise() can vary between the lion, tiger and bear. Implementing a method defined in a parent differently in its subclasses is called overriding. Sometimes, however, it doesn't make sense to define methods in abstract classes, but in the example below, I have done just to show you how overriding works.
Task 2.3 Shapes
Examine the abstract shapes class and create some squares
Open the shapesClass file using IDLE (right click and choose 'edit with IDLE'). Inspect the script and compare it to the inheritance diagram I have given below ...
https://drive.google.com/file/d/1iTxsElr_Qp7kRVABfcExkD_hvvfeoF3X/view?usp=drive_web
Click enlarge
In the class diagramIn Python
Protected attributes and methods are prefixed with a hash sign (#) Protected attributes and methods are prefixed with a single underscore (_)
Private attributes and methods are prefixed with a minus sign (-)Private attributes and methods are prefixed with a double underscore (__)
Public attributes and methods are prefixed with a plus sign (+)Public attributes and methods are not prefixed with anything at all!
Static attributes and methods are underlined Static attributes are included in the parent class outside the __init__ method. Static methods are preceded by the @staticmethod decorator.
Abstract methods are italicised.Abstract methods need to be declared as such using the @abstractmethod decorator and should raise a NotImplementedError
Each attribute shows its typeThere is no strict typing in Python so no need for this.
Each method shows the parameters with their type and, if relevant, a return type as well.Again, as there is no strict typing in Python, there is no need to declare this.
Execute the script using 'Run > Run Module' or press F5. The console window will appear and you will be given a new prompt. Type the following commands, pressing the Enter key after each one.
>>> myShape = shape("Blue")
>>> mySquare = square("Red",4)
>>> yourSquare = square("Green",6)
>>> mySquare.getColour()
>>> yourSquare.getColour()
>>> mySquare.setColour("Yellow")
>>> mySquare.getColour()
>>> yourSquare.getColour()
First, we try to instantiate an abstract shape object but we can't because it contains abstract methods (see below). Next we instantiate two objects called mySquare and yourSquare using the square(shape) subclass. The square(shape) class inherits both the private __colour property and the getColour() and setColour() methods from it's parent class, shape(). We then use those methods to query, change and requery the colour of mySquare() whilst making sure that the related property in yourSquare() remains unchanged.
Create a circle and compare it's behaviour to that of a square
Now we'll create a circle using the circle(shape) class and investigate the polymorphic behaviour of the getArea() and getPerimeter() functions of the square(shape) and circle(shape) class. Type the following commands, pressing the Enter key after each one.
>>> myCircle = circle("Blue",4)
>>> mySquare.getArea()
>>> myCircle.getArea()
>>> mySquare.getPerimeter()
>>> myCircle.getPerimeter()
You should notice that even though we created our square and our circle with the same value for the side and the radius, the getArea() and getPerimeter() functions behave differently. This is called polymorphism.
Implement your own triangle subclass
Now try to implement a new subclass called triangle(shape) and test it's operation. Document what you have done and print out your amended script to put in your notebooks.
Draw an inheritance diagram
Draw yourself an inheritance diagram including properties and methods to show the relationship between the different classes in your geometric world. Use the example above to help you.
OUTCOME : Documentation related to testing the development and operation of a new subclass, triangle and a lovely inheritance diagram.
Abstract, virtual and static methods
We've already seen an example of a static method in the petcaretaker.py script. Prefixing the method with the @staticmethod decorator allows it to be invoked without the instantiation of any objects of that class or subclass. They are often used to keep track of class wide attributes. I also used a static method in the shapes class to keep track of how many circles and squares had been instantiated from its subclasses.
The .getArea() method in the shapes class is known as a virtual method since it is defined in the parent class (albeit, just to provide an interface; an empty method) but can be overriden in the subclasses.
An abstract method is a method defined in a base class that may not provide any implementation but must be overriden in its subclasses. There is no built in way of declaring abstract methods directly in Python without using the Abstract Base Class (abc) module.
from abc import ABCMeta, abstractmethod
class abstract(object,metaclass=ABCMeta):
@abstractmethod
def cannotCallMe(self):
raise NotImplementedError
Well, you might ...
Task 2.4 Your own example
shapes.py class as inspiration
Use the shapes.py class that we have already met, try to come up with your own example which includes ...
Inheritance
Polymorphism
Abstract, virtual and static methods
If you can't come up with your own idea, try to implement the animals class (and it's associated subclasses).
OUTCOME : Class definitions of your own, including examples of inheritance, polymorphism, abstract, virtual and static methods.
Association
So far, we've only looked at examples where subclasses are defined by their parent classes. Sometimes, objects can associated with other objects. There are two situations ...
Composition association where one class belongs in a collection. This is an 'owns' relationship where the part cannot exist without the whole. If the whole is destroyed, so are its parts.
Aggregation association where one class belongs in a collection but does not depend on the whole for it's existence. This is a 'has' relationship.
For instance, a vehicle is composed of an engine, seats and wheels. When the vehicle is destroyed, so are the engine, seats and wheels. However, a car (which is a type of vehicle) can have an occupant (a driver or a passenger) who, hopefully, is not destroyed if the car is.
https://drive.google.com/file/d/0B83yXMOilskaTXh3LVBGcldjeHc/view?usp=drive_web
Click to enlarge
This diagram is based on UML (Unified Modelling Language) conventions, shown in moderate completeness below ...
https://drive.google.com/file/d/0B83yXMOilskaczd0UmE0QTlRTGM/view?usp=drive_web
Click to enlarge
Task 2.5 Association
Web browser
The vehicle example is a simple, and quite common one. Visit the following website and read about an example involving chairs. Make some notes, maybe draw a diagram, which explains how this example describes the two different types of association.
OUTCOME : Notes and / or diagram involving chairs and their association.
OOP Design Principles
You are only just beginning on a long journey into the mastery of OOP, but there are some key principles to keep you going.
Encapsulate what varies
Favour composition over inheritance
Program to interfaces, not implementation
Task 2.6 Read a book.
Web browser
Lack of integrity
There is so much reading material out there that it's difficult to know where to start. One of the most famous names in the field of object oriented design is Grady Booch - he was partly responsible for developing UML. One of his most well known books is called 'Object Oriented Analysis and Design with Applications'. A quick Google search will turn up some interesting results. Buy it from Amazon, obviously.
OUTCOME : Nothing really - just some reading if you want to learn more.
Extension Activities
How about these extra activities to whet your appetite further?
There is a great book called 'Learn You a Haskell for a Great Good' which is brilliant and great fun. You might want to grab yourself a copy or read it online for free. "Holy Sh*t!"
Fancy learning more OOP languages? Start with the following list of resources ...
Greenfoot : Teaches object oriented programming graphically using actors which live in worlds.
BlueJ : Very similar to Greenfoot but textual based rather than graphical.
Java : The 'classic' oop language.
If you need any help getting the software, have a word with me and I'll point you in the right direction.
A challenging programming exercise might be to write a program of the game Hangman, using objects. The computer thinks of a word, and the user has to guess what it is, by suggesting a letter. For each letter that is wrong, an additional part of the gallows is added to the display. When the user guesses the computer’s word correctly, they have won. When the complete gallows have been built, and the user has not yet guessed the word, the user has lost.
There is a great tutorial on OOP in Python at Python Course.
Some great notes on OOP design principles.
Full list of Python magic methods.
What's next?
Before you hand your book in for checking, make sure you have completed all the work required and that your book is tidy and organised. Your book will be checked to make sure it is complete and you will be given a spicy grade for effort.
END OF TOPIC ASSESSMENT
Last modified: April 9th, 2024