+ All Categories
Home > Documents > Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… ·...

Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… ·...

Date post: 02-May-2018
Category:
Upload: hoangdang
View: 215 times
Download: 2 times
Share this document with a friend
13
SOFTWARE ARCHITECTURES Chapter 3 Design Patterns: Model-View- Controller Martin Mugisha Brief History Smalltalk programmers developed the concept of Model-View-Controllers, like most other software engineering concepts. These programmers were gathered at the Learning Research Group (LRG) of Xerox PARC based in Palo Alto, California. This group included Alan Kay, Dan Ingalls and Red Kaehler among others. C language which was developed at Bell Labs was already out there and thus they were a few design standards in place[ 1] . The arrival of Smalltalk would however change all these standards and set the future tone for programming. This language is where the concept of Model-View- Controller first emerged. However, Ted Kaehler is the one most credited for this design pattern. He had a paper in 1978 titled ‘A note on DynaBook requirements’. The first name however for it was not MVC but ‘Thing-Model-View-Set’. The aim of the MVC pattern was to mediate the way the user could interact with the software[ 1] . This pattern has been greatly accredited with the later development of modern Graphical User Interfaces(GUI). Without Kaehler, and his MVC, we would have still been using terminal to input our commands. Introduction Model-View-Controller is an architectural pattern that is used for implementing user interfaces. Software is divided into three inter connected parts. These are the Model, View, and Controller. These inter connection is aimed to separate internal representation of information from the way it is presented to accepted users[ 2] . fig 1
Transcript
Page 1: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

Chapter 3 – Design Patterns: Model-View- Controller

Martin Mugisha

Brief History

Smalltalk programmers developed the concept of Model-View-Controllers, like

most other software engineering concepts. These programmers were gathered at the

Learning Research Group (LRG) of Xerox PARC based in Palo Alto, California. This

group included Alan Kay, Dan Ingalls and Red Kaehler among others. C language which

was developed at Bell Labs was already out there and thus they were a few design

standards in place[ 1] .

The arrival of Smalltalk would however change all these standards and set the

future tone for programming. This language is where the concept of Model-View-

Controller first emerged. However, Ted Kaehler is the one most credited for this design

pattern. He had a paper in 1978 titled ‘A note on DynaBook requirements’. The first

name however for it was not MVC but ‘Thing-Model-View-Set’. The aim of the MVC

pattern was to mediate the way the user could interact with the software[ 1] .

This pattern has been greatly accredited with the later development of modern

Graphical User Interfaces(GUI). Without Kaehler, and his MVC, we would have still

been using terminal to input our commands.

Introduction

Model-View-Controller is an architectural pattern that is used for implementing

user interfaces. Software is divided into three inter connected parts. These are the Model,

View, and Controller. These inter connection is aimed to separate internal representation

of information from the way it is presented to accepted users[ 2] .

fig 1

Page 2: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

As shown in fig 1, the MVC has three components that interact to show us our

unique information.

Component Interaction

Below is a detailed description of the interaction of the components in the MVC

design pattern:

1. Controller

A controller aids in changing the particular state of the model.

The controller takes input from the mouse and keyboard inputs from the

user and in turn commanding the model and view to change as required.

A controller interprets interactions from the view and translates them into

actions to be performed by the model. User interactions range from HTTP

POST and GET in Web applications or clicks and menu selections in

Standalone applications.

The controller is also responsible for setting the appropriate view to the

appropriate user.

2. Model

A model is an object representing date or even an activity. A database

table or even some particular plant-floor production machine process.

The model manages the behavior and also the data of the software

application domain.

The model accepts requests for information and responds to the set of

instructions meant to change that particular state.

The model shows application data and rules that manage access to update

this data.

The model shows the state and low-level behavior of the component. It

controls the state and all its changes

3. View

The view is the visual representation of the state of the model.

The view renders the contents of a model through accessing the data and

specifying how the data should be presented.

The view controls the graphical and textual output representations of the

software application.

A view typically attaches to a model and renders its contents for display.

In summary the MVC frame work likes like this:

Input- Processing Output

ControllerModelView

Page 3: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

Implementation of an MVC

In the section, I will talk about a few implementations of the MVC design pattern

and in particular with Web applications. The MVC pattern has become a popular design

pattern with large scale web enterprise application[ 2] .

Fig 2[ 2] below shows a sample implementation of MVC design patern. The

application is broken down into particular functions, tasks or operations each of which is

related to the particular user[ 2] . Each fuction refers to a single controller which may

refer to one or more controllers and usually just a single view. Each function deals with

an HTTP GET and POST request[ 2] .

Fig 2 .

The Model

This is a business entity which has all the properties and functions required by a

single business entity. It is always a subclass of an abstract super class with properties

and functions common to all database tables. The table is responsible for an array of

responsibility ranging from data validation, business rules to task specific behavior while

Page 4: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

actual generation of Data Manipulation Language (DML) statements is handled in a

separate class[ 2] .

The DML

This can also be called the Data Access Object and this is the only object in the

framework, which has the permission to communicate with the database. This object can

only be called by a model component. This helps in isolating the Model from the

underlying database and as such eases the applications ability to be switched from one

RDBMS to another simply by switching the DML class[ 2] .

The View

This an implementation of a series of scripts that are combined with specific

output from each database class to produce an XML document in this case. This file will

also include data associated with user menus pagination and scrolling. The XML is then

transformed into an HTML document by using generic XSL style sheets[ 2] .

The Controller

The component is implemented as a series of functions which interact with either

one or more models[ 2] . Each controller is a class and you can have an array of them

interacting with different models. Each of them often deal with the following:

Handling HTTP POST and GET request.

Instantiates an object for each business entity

It calls methods on those appropriate objects and thus dealing with a number of

database occurrences both as input and as output.

It calls the relevant view object.

A good way of understanding what all this means is that in a business of selling

shoes for example. There are mangers, sales clerks and the owner. Each of this can send

particular requests to the model through the controller and get views that show what is in

the database but relevant to them. A manger can have administrative privileges where he

can see everyone’s work hours, wages and sales. A sales clerk can only see what shoes

are available in the store and sale them but can’t see anyone else wage or work hours.

The owner can see all of this information and more like when his supplier is expected to

bring in more stock and how much he spends on the stock plus his gross and net profile.

Project

For a project to do further research into this concept, I chose to create a social

media application based on anonymous story telling where stories were tailored for each

user based on information the gave us on where they went to school at. I used PHP as the

scripting language combined with MySQL database.

Overview on PHP

PHP is at the forefront of the Web 2.0 boom. Though it’s a relatively young

programming language, just over fifteen years, there are millions of developers and

Page 5: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

powers over twenty million websites. Its large open source community and also leading

players in the IT market like IBM, Oracle and Microsoft endorse PHP[ 3] .

The development of PHP started in 1995 by Rasmus Lerdof[ 3] . He created a

personal collection of Perl scripts and transferred them into a package written in C. This

package came to be known as Personal Home Page or PHP for short[ 3] . This package

was later available as PHP/FI. The FI stood for Form Interpreter. It showed a lot of

similarities to Perl but yet was much easier to use[ 3] . Two years later, Lerdof released

PHP2.0

Fig 3

By 1997, Zeev Suraski and Andi Gutmans had started to rewrite PHP to make the

language better suited for ecommerce applications. The worked with Lerdof and changed

the meaning of PHP to ‘Hypertext Preprocessor; as it was widely known today. Which

resulted into PHP 3.0.

By 2000 Suraski and Gutmans had released PHP 4. This feature had simple object

oriented and session handling capabilities. At this point, the number of Web applications

using PHP had reached 2 million as shown in fig 3[ 3] . The large PHP community at his

point in conjunction with Suraski and Gutmans released PHP 5 in 2004[ 3] . This next

iteration included a full support for full object orientation, XML integration and the

SOAP protocol[ 3] . Below is an example of PHP OOP implementation:

class Person {

public $firstName;

public $lastName;

public function __construct($firstName, $lastName = ''){ // optional

second argument

$this->firstName = $firstName;

$this->lastName = $lastName;

}

Page 6: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

public function greet() {

return 'Hello, my name is ' . $this->firstName . ' ' . $this->lastName . '.';

}

public static function staticGreet($firstName, $lastName) {

return 'Hello, my name is ' . $firstName . ' ' . $lastName . '.';

}

}

$he = new Person('John', 'Smith');

$she = new Person('Sally', 'Davis');

$other = new Person('iAmine');

echo $he->greet(); // prints "Hello, my name is John Smith." echo '<br />';

echo $she->greet(); // prints "Hello, my name is Sally Davis." echo '<br />';

echo $other->greet(); // prints "Hello, my name is iAmine ." echo '<br />';

echo Person::staticGreet('Jane', 'Doe'); // prints "Hello, my name is Jane

Doe."

PHP 5.1 came in late 2005 and introduced an abstraction layer called PDO[ 3] .

This eased PHP’s use with various databases from different vendors[ 3] . By this point,

the number of web 2.0 applications with PHP was reaching 20 million as shown if fig 3.

PHP today is a fully comprehensive programming language with solid object

orientation support. It has often been referred to as a scripting language but it is more of a

dynamic programming language. Unlike the traditional C and Java, PHP doesn’t need to

be compiled but rather interpreted at run time. PHP is behind some of today’s most

revolutionary and powerful Web applications like Facebook which has a user base of

over 800 million and a constant Alexa rank of 2. Other Web apps include Digg, Yahoo

and Wordpress Some of whose logos are easily identified as shown in fig 4

Fig 4- Logos of popular apps using PHP

PHP MVC frameworks

PHP has had an array of open source and proprietary frameworks

developed to handle strict development. Companies like Facebook have developed their

own frameworks but never the less; they are many open source frameworks out there that

can be used to create your own Enterprise application with accordance to their particular

license. Below is a list of today’s most widely used frameworks, their release date and

type of license:

Page 7: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

Table showing Frameworks [ 4]

Project Start date Current stable

version

Release

date License

Agavi 2005-05 1.0.7 2011-12-22 LGPL

Aiki Framework 2009-09 0.9.1 2012-02-23[7] GPLv3

AppFlower 2009-02 1.3 2012-10-09 GPLv3

CakePHP 2005-08 2.4.7[8] 2014-04-05 MIT

Cgiapp 2004-12 1.0 2004-12-01[9] LGPL

CodeIgniter 2006-02-28 2.1.4 2013-07-

08[10] OSLv3

Fat-Free 2009-09 3.1.0 2013-08-19 GPLv3

FuelPHP 2011-08 1.7.1 2013-12-01 MIT

Hazaar MVC 2012-10 1.1 2013-04-19 Apache 2.0

Joomla 2005-08-17 2.5.19 2014-03-06 GPLv2

Kajona 2006 4.2 2013-07-16 LGPLv2

Laravel 2011-06-11 4.1 2013-12-11 MIT

Lithium 2009-10 0.11 2012-10-03 BSD

Nette Framework 2006-01[11] 2.1.2 2014-03-

17[12]

New

BSD, GPLv2, GPLv3[13]

PHPixie 2012-07 2.1 2012-04-24 BSD

PRADO 2004-01 3.2.2[14] 2013-07-20 New BSD[15]

Qcodo 2005-10 0.4.22 2011-08-

15[16] MIT

Seagull 2003-10 1.0.4 2013-01-04 BSD

SilverStripe 2005-11 3.0.5 2013-02-20 BSD

Symfony 2005-10 2.3.1 2013-06-19 MIT

TYPO3 Flow 2011-10 2.0.0 2013-07-12 LGPLv3

Xyster Framework 2007-09 02 Build 01 2010-10-18 BSD

Yii 2008-01 1.1.14 2013-08-11 New BSD

Zend Framework 2006-03 2.2.5 2013-10-31 New BSD

Page 8: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

The above libraries all have a few characteristics in common. They all provide

libraries to access the database session management and promote code reuse. This in turn

means that the effort and time put into development is significantly reduced and so are

the resources required to develop and maintain the web application.

Architecture of the framework.

The diagram below, Fig 5[ 5] shows the basic PHP framework with a database

management based on MVC.

Fig 5

Mode of interaction

1. User sends a request to the controller

2. Controller analyses the request and calls the Model

3. The model does the necessary logic and connects to the database to make these

changes in it.

4. The model sends the results to the controller.

5. The controller forwards the data to the view.

6. Results that respond to that particular user are sent to that user.

Components:

Explained below is how these components interact with each other:

The model

It is the core of the application of the framework and often handles Database

connection. Classes in the model are used to manipulate data in the database e.g

deleting, inserting and updating information of the particular user[ 5] .

Page 9: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

The View

This is the user interface of the controller. It is the face of the response to

users events. Presentation is often in HTML, CSS, JavaScript. Multiple views can

exist for a single model[ 5] .

The Controller

This component implements the flow of control between the view and the

model[ 5] . It as mentioned earlier contains code that handles actions that cause a

change on the model.

Codeigniter

I used codeigniter as a framework of choice. This is because it is one of the most

widely used frameworks. Ranking at the top in popularity searches for the framework

according to Google trends and also the number of jobs offered for expertise in

knowledge about use[ 5] . Fig 6[ 5] below shows the trends in 2012 for how people

searched for the most popular frameworks and as expected, Codeigniter came on top.

Fig 6

Codeigniter is also well documented and easy to learn as compared to the ot her

top 5. I was able to develop a hello world app fastest in Codeigniter during my selection

process. It also has an array of pre-defined libraries like Calendar, e-mail, validation,

uniting testing, session etc. These well documented libraries eased my development of

the task at hand.

Project Design

Codeigniter calls the default controller set in the config file when thee application

is initially run. My default controller rendered a view with a login page and a link to

register if you don’t have an account.

Page 10: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

This log in page is simply a form and when submitted is sent to the controller

meant to handle this information. Below is a snippet of the code used in the controller to

handle this the information sent to the ‘Auth’ controller in the event you had forgotten

your password clicked forgot password .

if (!defined('BASEPATH')) exit('No direct script access allowed');

class Auth extends CI_Controller {

function __construct() {

parent::__construct();

$this->load->helper(array('form', 'url'));

$this->load->library('form_validation');

$this->load->library('auth_lib’);

}

/**

* Generate reset code (to change password) and send it to user

*

* @return void

*/

function forgot_password() {

if ($this->auth_lib->is_logged_in()) { // logged in

redirect('');

} elseif ($this->auth_lib->is_logged_in(FALSE)) { // logged in, not activated

redirect('/auth/send_again/');

} else {

$this->form_validation->set_rules('login', 'Email or login', 'trim|required|xss_clean');

$data['errors'] = array();

if ($this->form_validation->run()) { // validation ok

if (!is_null($data = $this->auth_lib->forgot_password(

$this->form_validation->set_value('login')))) {

$data['site_name'] = $this->config->item('website_name', ‘auth_lib’);

// Send email with password activation link

$this->_send_email('forgot_password', $data['email'], $data);

$this->_show_message($this->lang->line('auth_message_new_password_sent'));

} else {

$errors = $this->auth_lib->get_error_message();

foreach ($errors as $k => $v)

$data['errors'][$k] = $this->lang->line($v);

}

}

$this->load->view('auth/forgot_password_form', $data);

}

}

Page 11: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

In summary, the controller would send you to the forgot_password_form after the

from validations finds out there was nothing entered in the form and render the view

below:

When “Get a new password is clicked” the form validation will succeed and the

controller will send you to the “auth_lib” library which I used to intermediate between

this controller and the Model as this Controller will need information from various

Models, so to keep the Controller small, I created a library to mediate. This is also an

advantage of Codeigniter. Creating your own Libraries is easy.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

require_once('phpass-0.1/PasswordHash.php');

define('STATUS_ACTIVATED', '1');

define('STATUS_NOT_ACTIVATED', '0');

class Auth_lib

{

private $error = array();

function __construct()

{

$this->ci =& get_instance();

$this->ci->load->config(‘auth_lib', TRUE);

$this->ci->load->library('session');

$this->ci->load->database();

$this->ci->load->model('auth_model/users');

$this->ci->load->model('auth_model/user_autologin');

//Other models taken out from snippet

// Try to autologin

$this->autologin();

}

function reset_password($user_id, $new_pass_key, $new_password)

{

if ((strlen($user_id) > 0) AND (strlen($new_pass_key) > 0) AND

(strlen($new_password) > 0)) {

if (!is_null($user = $this->ci->users->get_user_by_id($user_id, TRUE))) {

// Hash password using phpass

$hasher = new PasswordHash(

$this->ci->confi->item('phpass_hash_strength', ‘auth_lib'),

$this->ci->config->item('phpass_hash_portable', 'auth_lib'));

$hashed_password = $hasher-

>HashPassword($new_password);

if ($this->ci->users->reset_password(

$user_id,

$hashed_password,

Page 12: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

$new_pass_key,

$this->ci->config->item('forgot_password_expire', ‘auth_lib'))) { //

success

// Clear all user's autologins

$this->ci->user_autologin->clear($user->id);

return array(

'user_id' => $user_id,

'username'=> $user->username,

'email' => $user->email,

'new_password' => $new_password,

);

}

}

}

return NULL;

}

This function above will need to use two models i.e. “Users” model and the

“User_autologin” model. Below I will show you a small snippet of the code used in the

Users model to reset the password:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Users extends CI_Model

{

private $table_name = 'users'; // user accounts

private $profile_table_name = 'user_profiles'; // user profiles

function __construct()

{

parent::__construct();

$ci =& get_instance();

$this->table_name = $ci->config->item('db_table_prefix', 'auth_lib').$this-

>table_name;

$this->profile_table_name = $ci->config->item('db_table_prefix', 'auth_lib').$this-

>profile_table_name;

}

function reset_password($user_id, $new_pass, $new_pass_key, $expire_period = 900)

{

$this->db->set('password', $new_pass);

$this->db->set('new_password_key', NULL);

$this->db->set('new_password_requested', NULL);

$this->db->where('id', $user_id);

$this->db->where('new_password_key', $new_pass_key);

$this->db->where('UNIX_TIMESTAMP(new_password_requested) >=', time()

$expire_period);

$this->db->update($this->table_name);

return $this->db->affected_rows() > 0;

}

Page 13: Chapter 3 Design Patterns: Model-View- Controllercwt/COURSES/2014-01--CSCE-4543--SW-ARCH/… · SOFTWARE ARCHITECTURES Chapter 3 – Design Patterns: Model-View- Controller Martin

SOFTWARE ARCHITECTURES

As you can tell above, the model will connect to the database and change the data

related to this particular user. Though I did not show code for what the view looked like,

you can notice from the little I have shown above how the OOP principles being followed

that are the same in the regular programming languages like JAVA. The code is also easy

to read and follow. And shows a perfect example of the MVC interaction. My project

turned out to be more extensive than I thought as a lot had to be done to maintain strict

development standards and security of information. I also used a bunch of other

technologies like JQuery libraries and the twitter Bootstrap CSS framework to build a

more attractive user interface.

I was able to have some substantial progress with a lot of elements of this

application developed as the full stack developer. The development time for the

deliverables I was able to accomplish could have taken up to three or four times longer if

I had not used this framework.

Conclusion

By choosing the right software technologies, development of an application can

be changed dramatically. The MVC pattern framework is an example of that technology.

It eases the development of maintainable code. It also eases labor division as developers

can be split into User Interface developers and application logic. Extending and reusing

applications written in the MVC pattern is easy e.g. A single model can be used by

multiple controllers and also a single controller can use multiple models.

All in all, MVC frameworks reduce development time, promote code re-use and

ease specialization of developers. This in turn maximizes the potential results obtained

from the developers making it a revolutionary concept.

References

[1] "PHP MVC Tutorial: Understanding the Model-View-Controller." Udemy Blog.

N.p., n.d. Web. 29 Apr. 2014. <https://www.udemy.com/blog/php-mvc-tutorial/>.

[2] "The Model-View-Controller (MVC) Design Pattern for PHP." The Model-View-

Controller (MVC) Design Pattern for PHP. N.p., n.d. Web. 29 Apr. 2014.

<http://www.tonymarston.net/php-mysql/model-view-controller.html#introduction>

[3] "An overview of php." zend.org. N.p., n.d. Web. 29 Apr. 2014.

<http://static.zend.com/topics/overview_on_php.pdf>.

[4] "Comparison of web application frameworks." Wikipedia. Wikimedia Foundation,

29 Apr. 2014. Web. 29 Apr. 2014. <http://en.wikipedia.org/wiki/Comparison_of

web_application_framework>.

[5] "PHP FRAMEWORK FOR DATABASE MANAGEMENT BASED ON MVC

PATTERN ." http://airccse.org/. N.p., n.d. Web. 29 Apr. 2014.

<http://airccse.org/journal/jcsit/0411csit19.pdf


Recommended