object-oriented design excerpted from number 2130: “imaginary christmases”, from . used with...

24
Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from http://www.questionablecontent.net/ . Used with permission of the artist, Jeph Jacques.

Upload: jaron-cutting

Post on 14-Dec-2015

215 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Object-Oriented Design

Excerpted from Number 2130: “Imaginary Christmases”, from http://www.questionablecontent.net/. Used with permission of the artist, Jeph Jacques.

Page 2: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

What will we learn?

• What are objects?• What are object classes?• How to implement objects correctly.• How to draw UML Class diagrams• Some prinicples of Object-Oriented Design.

Page 3: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

transaction.numberOfShares = Math.floor((transaction.dollarAmt - transaction.commission) / transaction.sharePurchasePrice);transaction.costOfTransaction = (transaction.numberOfShares * transaction.sharePurchasePrice) + transaction.commission;transaction.unspent = transaction.dollarAmt - transaction.costOfTransaction;

Transaction

numberOfSharescostOfTransaction

unspentdollarAmt

commissionsharePurchasePrice

Quiz

questionsnextQuestion

Question

typeanswers

questionTextnextAnswer

Answer

answerTextcorrectOrIncorrect1 (0, n) 1 (0, n)

Page 4: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Objects have:

Types (Transaction, Quiz, Question, Answer)

Also known as “Class” or “Object Class”

Properties (transaction.numberOfShares, question.questionText)

Also known as “attributes”, “members”, “member variables”

Page 5: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

transaction.dollarAmt.toFixed(2)

document.getElementById(“quizText”)

quizText.split(“\n”)

Take some object and apply some function to it.

Page 6: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Objects have:

Types (Transaction, Quiz, Question, Answer)

Also known as “Class” or “Object Class”

Properties (transaction.numberOfShares, question.questionText)

Also known as “attributes”, “members”, “member variables”

Member functions (text.split(separator), document.getElementById(id))

Also known as “methods”

Page 7: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Quiz

questionsnextQuestion

Question

typeanswers

questionTextnextAnswer

Answer

answerTextcorrectOrIncorrect1 (0, n) 1 (0, n)

Universal Modeling Language (UML) Conceptual Class Diagram

toHTML(): Stringscore(): Number addAnswer(answer)

toHTML(): String

Page 8: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

transaction.dollarAmt.toFixed(2)

document.getElementById(“quizText”)

quizText.split(“\n”)

Take some object and apply some function to it.

function mySplit(text, separator){

var lines=new Array();var pos;

do {pos=text.search(separator);if(pos>-1) {

lines[lines.length]=text.substr(0, pos);text=text.substr(pos+1);

}} while(pos>-1);lines[lines.length]=text;return(lines);

}

Would quizText.mySplit(“\n”) work?

If I defined a function “mySplit” like this:

Page 9: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

quizText.mySplit(“\n”) doesn’t work:

mySplit is expecting two parameters

quizText.mySplit is undefined

OK, so set quizText.mySplit = mySplit;

OK, so change the function definiton:function mySplit(separator){

var lines=new Array();var pos;

do {pos=text.search(separator);if(pos>-1) {

lines[lines.length]=text.substr(0, pos);text=text.substr(pos+1);

}} while(pos>-1);lines[lines.length]=text;return(lines);

}

Oops, now “text” is undefined.

Introducing the “this” variable.

Page 10: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

function mySplit(separator){

var lines=new Array();var text=this;var pos;

do {pos=text.search(separator);if(pos>-1) {

lines[lines.length]=text.substr(0, pos);text=text.substr(pos+1);

}} while(pos>-1);lines[lines.length]=text;return(lines);

}

function someFunction(){

var text=“To be or not to be, that is the question.”;var lines;

text.mySplit=mySplit;lines=text.mySplit(“ “);… some other code …

}

Where do we set our methods?

Page 11: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

function Question(questionText){

var question=new Object();

question.questionText=questionText;question.answers=new Array();return(question);

}

function someFunction(){

var question;

…question = Question(lineFields[2]);…

}

function Question(questionText){

this.questionText=questionText;this.answers=new Array();

}

function someFunction(){

var question;

…question = new Question(lineFields[2]);…

}

Wrong

Right

Page 12: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Objects have:

Types (Transaction, Quiz, Question, Answer)

Also known as “Class” or “Object Class”

Properties (transaction.numberOfShares, question.questionText)

Also known as “attributes”, “members”, “member variables”

Member functions (text.split(separator), document.getElementById(id))

Also known as “methods”

Constructors (Quiz(), Question(), MultipleChoiceQuestion(), Answer())

Page 13: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

function QuestionAddAnswer(answer){

this.answers[this.answers.length]=answer;answer.id="A"+this.answers.length;

}

function QuestionToHTML(q){

var text = "";

text += "<h3>Question "+(q+1)+"</h3><p>"+this.questionText+"</p>";text += "<ul style=\"list-style-type:none;\">";for(a=0; a<this.answers.length; a++) {

text += this.answerToHTML(a);}text += "</ul>";return text;

}

function Question(questionText){

this.questionText=questionText;this.answers=new Array();this.addAnswer=QuestionAddAnswer;this.toHTML=QuestionToHTML;

}

function someFunction(){

var question;

…question = new Question(lineFields[2]);…

}

Page 14: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Objects have:

Types (Transaction, Quiz, Question, Answer)

Also known as “Classes” or “Object Classes”

Properties (transaction.numberOfShares, question.questionText)

Also known as “attributes”, “members”, “member variables”

Member functions (text.split(separator), document.getElementById(id))

Also known as “methods”

Constructors (Quiz(), Question(), MultipleChoiceQuestion(), Answer())

Instances (new Quiz(), new Question(), new Array(), new Object())

You “instantiate” an object class to create a new object, or “instance”

Object classes have:

Page 15: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

One of the main principles of OOP: “Encapsulation”

Object classes are little “bundles” of properties and methods

This make object classes cohesive, allowing easy reuse

An object class “encapsulates” its properties and methods

Meaning 1:

Object classes can “hide” their implementations

Meaning 2:

Implementations can change without changing all the code that uses them

This is like plugging in a different keyboard in your computer

The Question class we just looked at encapsulates its functionality in the first sense.

Page 16: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

function QuestionToHTML(q){

var text = "";

text += "<h3>Question "+(q+1)+"</h3><p>"+this.questionText+"</p>";text += "<ul style=\"list-style-type:none;\">";for(a=0; a<this.answers.length; a++) {

text += this.answerToHTML(a);}text += "</ul>";return text;

}

function MultipleChoiceAnswerToHTML(a){

var answer=this.answers[a];

return "<li id=\""+this.id+answer.id+"Line\"><input type=\"radio\" name=\"“+this.id+"\" id=\""+this.id+answer.id+"\" /> "+answer.answerText+" <span id=\""+this.id+answer.id+"Answer\"></span></li>";

}

function MultipleChoiceQuestion(questionText){

Question.call(this, questionText); …this.answerToHTML=MultipleChoiceAnswerToHTML;…

}

Page 17: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

function QuestionToHTML(q){

var text = "";

text += "<h3>Question "+(q+1)+"</h3><p>"+this.questionText+"</p>";text += "<ul style=\"list-style-type:none;\">";for(a=0; a<this.answers.length; a++) {

text += this.answerToHTML(a);}text += "</ul>";return text;

}

function CheckAllAnswerToHTML(a){

var answer=this.answers[a];

return "<li id=\""+this.id+answer.id+"Line\"><input type=\"checkbox\" id=\""+this.id+answer.id+"\" /> "+answer.answerText+" <span id=\""+this.id+answer.id+"Answer\"></span></li>";

}

function CheckAllQuestion(questionText, feedbackText){

Question.call(this, questionText); …this.answerToHTML=CheckAllAnswerToHTML;…

}

Page 18: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

MultipleChoiceQuestions and CheckAllQuestions are both types of Questions

They both have all the properties and methods of the Question class

They also have custom methods for displaying their answers

Page 19: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Objects have:

Types (Transaction, Quiz, Question, Answer)

Also known as “Classes” or “Object Classes”

Properties (transaction.numberOfShares, question.questionText)

Also known as “attributes”, “members”, “member variables”

Member functions (text.split(separator), document.getElementById(id))

Also known as “methods”

Constructors (Quiz(), Question(), MultipleChoiceQuestion(), Answer())

Instances (new Quiz(), new Question(), new Array(), new Object())

You “instantiate” an object class to create a new object, or “instance”

Object classes have:

Children (MultipleChoiceQuestion, TrueFalseQuestion)

Also known as sub-classes

Parents (Question, Object)

Also known as parent classes, super-classes, or base classes.

Page 20: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

MultipleChoiceQuestions and CheckAllQuestions are both types of Questions

They both have all the properties and methods of the Question class

They also have custom methods for displaying their answers

Inheritance: the child class “inherits” properties and methods from the parent class.

The parent holds more general properties and methods common to child classes

The child class holds more specific properties shared only by itself and its children

Page 21: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Quiz

questions

Question

answersquestionText

Answer

answerTextcorrectOrIncorrect

id1 (0, n) 1 (0, n)

Universal Modeling Language (UML) Conceptual Class Diagram

addQuestion(question)toHTML(): Stringscore(): Number

addAnswer(answer)toHTML(): String

MultipleChoiceQuestion

id

score(): NumberanswerToHTML(a): String

TrueFalseQuestion CheckAllQuestion UnknownQuestion

id

score(): NumberanswerToHTML(a): String

idfeedbackText

score(): NumberanswerToHTML(a): String

toHTML(): String

id

score(): NumberanswerToHTML(a): String

Page 22: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

MultipleChoiceQuestions and CheckAllQuestions are both types of Questions

They both have all the properties and methods of the Question class

They also have custom methods for displaying their answers

When the toHTML method of Questions is being run, it just calls answerToHTML

MultipleChoiceAnswerToHTML is run for MultipleChoiceQuestions

CheckAllAnswerToHTML is run for CheckAllQuestions

The toHTML method of Questions doesn’t have to know anything about this

When I add a new question type, I don’t have to change toHTML at all.

I only have to define an answerToHTML method in the constructor for my new type.

Inheritance: the child class “inherits” properties and methods from the parent class.

The parent holds more general properties and methods common to child classes

The child class holds more specific properties shared only by itself and its children

Polymorphism (greek for “many shapes”): different classes present the same interface

Homomorphism (greek for “same shapes”): the same interface looks the same

Page 23: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Question

MultipleChoiceQuestion

TrueFalseQuestion

CheckAllQuestion

UnknownQuestion

From the inside, everything has a different shape: Polymorphism

Interface

score()

toHTML()

answerToHTML()

answers

questionText

From the outside,everything has the same shape:Homomorphism

quiz.score()

quiz.toHTML()

Page 24: Object-Oriented Design Excerpted from Number 2130: “Imaginary Christmases”, from . Used with permission of the artist,

Objects have classes, properties, methods, constructors.

Object classes have instances, sub-classes, super-classes.

First main principle of OOP: “Encapsulation”

Second main principle of OOP: “Inheritance”

Third main principle of OOP: “Polymorphism”

What have we learned:

How to write methods using “this”

The right way to write constructors using “this” and “new”

How to draw UML Class diagrams

Complicated technical details about implementing data-hiding encapsulation

More technical details about implementing inheritance

What’s left?: