Monday, December 17, 2012

MVC Approaching for OOP Based Application Design using C++

"MVC Approaching for Object Oriented Programming Based Application Using C++"
Dari judul artikel seperti itu setidaknya ada 3 hal yang harus dipahami sebelum meneruskan  membaca tulisan tidak jelas ini. Yaitu MVC design, Object Oriented Programming dan C++. Mungkin bagi sebagian besar orang yang terbiasa menggunakan pendekatan OOP dalam mengembangkan aplikasi mungkin bertanya, "OOP kok pake C++? struktur MVC lagi..", yaa setidaknya itu yang muncul di benak saya ketika mengetahui kenyataan bahwa harus menggunakan pendekatan dengan kombinasi yang cukup dibilang sulit ini.
C++ untuk develop aplikasi berbasis OO dan arsitektur MVC ditambah harus ada penggunaan persistence data. Cukup mengerikan rasanya. Umumnya bahasa OOP yang sering saya gunakan antara lain C#, Java maupun AS3 memiliki struktur yang sama. 1 class di wakili 1 file, tidak perlu bingung ngatur dependensi antar class juga, sangat mudah dalam penggunaan template class dan static variable. Dan sekarang harus melakukan semua itu di C++ yang dibuat untuk procedural programming ditambah lagi harus mengatur arus data ke File layaknya sebuah DMBS. Haha, pusing kalo dipikir. Yasudah lah ya dipikir aja tidak dikerjakan ya sama aja nol. Diruntut saja lah ya satu per satu.
Disini kita asumsikan saja sudah paham betul dengan konsep pemrograman C++ dan OOP yang dipaksakan dengan C++. Jadi masalahnya adalah bagaimana mengubah pendekatan object oriented umum yang biasanya berorientasi simulasi menjadi konsep yang berorientasi ke data. Umumnya jika belajar OOP yang ditekankan adalah bagaimana membuat keadaan di dunia nyata digambarkan dalam sebuah struktur class utuh. Dan yang seperti ini menurut saya bisa dibilang sebuah simulasi. Class yang dibuat umumnya class actor. Maksudnya, class-class ini merupakan sesuatu yang bisa melakukan perilaku sesuai methodnya. Misalnya class Student beri method doTask() yang menggambarkan seorang mahasiswa yang mampu mengerjakan tugasnya melalui method doTask(). Sedangkan jika berbicara arsitektur MVC yang umumnya untuk aplikasi berbasis Sistem Informasi, permodelannya sudah beda lagi. Di konsep ini pendekatannya adalah data yang terlibat di sistem, bukan siapa atau apa yang terlibat di dalam sistem. Umumnya di model ini class yang dibuat adalah class Entity yang isinya hanya enkapsulasi karakteristik datanya. Sebagai contoh, class Faculty dengan attribut id dan nama, sedangkan method-nya hanya berupa setter-getter saja, hanya untuk mengenkaspsulasi data atributnya.
Nah, dengan konsep yang berbeda jauh dari 2 permodelan ini tentu saja tidak bisa dipelajari dalam waktu singkat. Yang jelas, kalo menggunakan bentu MVC cocoknya untuk sistem informasi sedangkan klo dimodelkan OOP umum berbentuk simulasi atau game lebih cocok.
Dalam arsitektur MVC dibagi menjadi 3 bagian utama yaitu "M" untuk Model, "V" untuk "View" dan C untuk "Controller". Kalo dijelaskan satu persatu pasti butuh waktu lama. Yang jelas Model itu kelompok class yang digunakan sebagai data,  View adalah yang ditampilkan ke pengguna aplikasi, sedangkan Controller adalah pengatur arus data yang diambil dan ditampilkan ke View.
Well, langsung saja ke contoh kasus yang sangat sederhana sekali. Jadi misalkan ada sistem informasi yang hanya untuk manajemen data jurusan di suatu Institut teknik. Jadi datanya hanya data fakultas. Misalnya dibuatkan class Faculty. Kemudian untuk melakukan managemen data tersebut dibuatkan controller dengan nama FacultyController. Jadi untuk menambah, mengupdate dan menghapus data harus dilakukan melalui controller itu.
Desain class secara keseluruhan
Dari diagram tersebut class Faculty berperan sebagai data, sering juga disebut Persistence class atau Entity class. Di class tersebut hanya ada attribut dan setter-getter. DataAccess merupakan template class untuk entity controller. Dalam hal ini adalah FacultyController. Dengan memanfaatkan template class ini jika suatu saat ingin ditambahkan entity class baru, maka controllernya tinggal menjadi sub-class dari DataAccess dan mengimplementasi abstract method dari class tersebut. Dengan cara tersebut controller sudah bisa digunakan. Jadi template ini akan sangat membantu jika diperlukan banyak entity class dalam suatu kasus.
Implementasi dapat didownload di QueryBuilder.zip(~7 KB)

 

Monday, June 25, 2012

Object Oriented Programming Day 2 - Working with Class(1) : Class Properties

Previous Section : Basic Concepts in OOP(Completed)


Dalam mempelajari OOP, memahami konsep class dan object adalah modal utama. Jika kedua konsep dasar dikuasai insyaAllah untuk lajut ke konsep berikutnya akan lebih mudah. Karena Class merupakan salah satu konsep inti OOP maka saya rasa perlu dibahas pertama kali. Selama mempelajari OOP istilah class dan object akan sangat sering ditemui. Tidak perlu berlama-lama, saya coba sedikit deskripsikan mengenai 2 konsep tersebut.

Class

Secara konsep, class dapat dideskripsikan sebagai blueprint atau rancangan object.  Sebuah class pasti memiliki properties yang dimiliki semua objek yang masuk ke class tersebut. Setiap class mempunya 2 properti utama, yaitu attribute dan method. Attribute adalah sifat dasar yang dimiliki setiap object yang termasuk dalam suatu class. Sedangkan method adalah suatu operasi yang mungkin dilakukan pada objek dari suatu class yang bisa mengubah nilai atribut suatu object. Oleh karena itu dikenal konsep access modifier. Konsep ini digunakan untuk membatasi akses class lain ke suatu class tertentu. Semisal ada class Square yang merupakan blueprint dari semua bentuk segiempat berarturan yaitu persegi dan persegi panjang. Untuk menentukan properties apa saja yang dimiliki class Square, maka harus dianalisa hal apa saja yang dimiliki semua jenis segi empat. Kita tau bahwa semua segi empat pasti memiliki 5 sifat utama. Semua segi empat pasti mempunya panjang, lebar, Keliling, dan Luas dan posisi. Sehingga dapat disimpulkan bahwa Class Square memiliki 5 atribut, yaitu panjang, lebar, luas, keliling dan posisi. Untuk posisi sendiri bisa dianggap class lain, karena posisi bisa terdiri dari posisi koordiat X dan koordinat Y.
Untuk method dari Square tentu saja beberapa operasi yang mungkin dilakukan pada class Square, yaitu antara lain memberi nilai atrribut, mendapatkan nilai attribute, menghitung luas, mendapatkan luas, menghitung keliling dan mendapatkan kelilingnya.

 

Object

Object merupakan instance dari suatu class. Analoginya adalah seperti individu dari populasi. Jadi jika Object adalah individu dari suatu populasi, maka class adalah kumpulan individu sejenis. Sejenis disini maksudnya mempunyai properties yang sama.

 

Impelementasi

Untuk bagian ini sebelumnya harus menguasai terlebih dahulu tentang konsep dasar bahasa pemrograman yang sesuai, misalanya input-output, deklarasi variabel, deklarasi fungsi dan aturan dasar yang lain. Kali ini coba saya berikan contoh implementasi sederhana berkaitan dengan konsep Class dan Object. Impelementasi ini  saya buat dalam 3 bahasa pemrograman umum yang mendukung konsep OOP. Yaitu C++, C# dan Java.

C++ Code

Dalam mengimplementasikan di bahasa C++ setidaknya harus ada 2 file untuk setiap class ditambah 1 file main untuk testing. Karena class yang akan dibuat ada 2 file, 1 file header(*.h) yang fungsinya mendefinisakan atribut dan prototype method 1 file implementasi(*.cpp) untuk implementasi fungsi, maka setidaknya ada 5 file yang diperlukan untuk sesi ini.
Position.h
#pragma once
class Position
{
// Attributes
private: // attribut access modifier is set to private
       int x;
       int y;
// Methods Prototypes
public: // attribut access modifier is set to public
       Position(void);
       void setPosition(int x, int y);
       int getX();
       int getY();
       ~Position(void);
};

Position.cpp
#include "Position.h"

Position::Position(void)
{
       this->x = 0;
       this->y = 0;
}
void Position::setPosition(int x, int y)
{
       this->x = x;
       this->y = y;
}
int Position::getX()
{
       return this->x;
}
int Position::getY()
{
       return this->y;
}
Position::~Position(void)
{
}

Square.h
#pragma once
#include "Position.h"

class Square
{
private:
       int width;
       int height;
       int area;
       int circumtance;
       Position position;
public:
       Square(void);
       void setWidth(int width);
       void setHeight(int height);
       void setPosition(int x, int y);
       void calculateCircumtance();
       void calculateArea();
       int getWidth();
       int getheight();
       int getPositionX();
       int getPositionY();
       int getCircumtance();
       int getArea();
       ~Square(void);
};


Square.cpp
#include "Square.h"


Square::Square(void)
{
       this->area = 0;
       this->circumtance = 0;
       this->width = 0;
       this->height = 0;
}

void Square::setWidth(int width)
{
       this->width = width;
}

void Square::setHeight(int height)
{
       this->height = height;
}

void Square::setPosition(int x, int y)
{
       this->position.setPosition(x, y);
}

void Square::calculateCircumtance()
{
       this->circumtance = 2 * (this->width + this->height);
}

void Square::calculateArea()
{
       this->area = this->width * this->height;
}

int Square::getWidth()
{
       return this->width;
}
int Square::getheight()
{
       return this->height;
}

int Square::getPositionX()
{
       return this->position.getX();
}

int Square::getPositionY()
{
       return this->position.getX();
}

int Square::getCircumtance()
{
       return this->circumtance;
}

int Square::getArea()
{
       return this->area;
}

Square::~Square(void)
{

}


Main.cpp
#include <iostream>
#include <string>
#include "Square.h"

using namespace std;

void printProperties(Square square, string instanceName)
{
       cout << "Properties of " << instanceName << endl;
       cout << "Width\t\t: " << square.getWidth() << endl;
       cout << "Height\t\t: " << square.getheight() << endl;
       cout << "Position\t: " << square.getPositionX() << "," << square.getPositionY() << endl;
       cout << "Before Calculation" << endl;
       cout << "Circumstance\t: " << square.getCircumtance() << endl;
       cout << "Area\t\t: " << square.getArea() << endl;
       square.calculateArea();
       square.calculateCircumtance();
       cout << "After Calculation" << endl;
       cout << "Circumstance\t: " << square.getCircumtance() << endl;
       cout << "Area\t\t: " << square.getArea() << endl << endl;
}
int main()
{
       Square s1; // s1 is an instance of Class Square
       Square s2; // s2 is an instance of Class Square, note that s1 != s2
       cout << "Before initialization" << endl;
       printProperties(s1, "s1");
       printProperties(s2, "s2");
       // initilize s1 and s2
       s1.setWidth(100);
       s1.setHeight(100);
       s1.setPosition(5, 10);
       s2.setWidth(150);
       s2.setHeight(50);
       s2.setPosition(15, 30);
       cout << "After initialization" << endl;
       printProperties(s1, "s1");
       printProperties(s2, "s2");

       // edit s1 and s2
       s1.setWidth(200);
       s1.setHeight(100);
       s1.setPosition(10, 10);
       s2.setWidth(190);
       s2.setHeight(90);
       s2.setPosition(155, 20);

       cout << "After edit" << endl;
       printProperties(s1, "s1");
       printProperties(s2, "s2");

       system("pause");
       return 0;
}


C# Code

Dalam mengimplementasikan di bahasa C# setidaknya harus ada 1 file untuk setiap class ditambah 1 file main untuk testing.  Maka setidaknya ada 3 file yang diperlukan untuk sesi ini.

Position.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSharpImplementation
{
    class Position
    {
        // attributes set to private
        private int x;
        private int y;

        // methods set to public
        public Position()
        {
            this.x = 0;
            this.y = 0;
        }

        public void setPosition(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public int getX()
        {
            return this.x;
        }

        public int getY()
        {
            return this.y;
        }


    }
}


Square.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSharpImplementation
{
    class Square
    {
        private int width;
        private int height;
        private int area;
        private int circumtance;
        private Position position;

        public Square()
        {
            this.position = new Position();
            this.area = 0;
            this.circumtance = 0;
            this.width = 0;
            this.height = 0;
        }
        public void setWidth(int width)
        {
            this.width = width;
        }

        public void setHeight(int height)
        {
            this.height = height;
        }

        public void setPosition(int x, int y)
        {
            this.position.setPosition(x, y);
        }

        public void calculateCircumtance()
        {
            this.circumtance = 2 * (this.width + this.height);
        }

        public void calculateArea()
        {
            this.area = this.width * this.height;
        }

        public int getWidth()
        {
            return this.width;
        }
        public int getheight()
        {
            return this.height;
        }

        public int getPositionX()
        {
            return this.position.getX();
        }

        public int getPositionY()
        {
            return this.position.getX();
        }

        public int getCircumtance()
        {
            return this.circumtance;
        }

        public int getArea()
        {
            return this.area;
        }
    }
}



Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSharpImplementation
{
    class Program
    {
        public static void printProperties(Square square, string instanceName)
        {
            Console.WriteLine("Properties of " + instanceName);
            Console.WriteLine("Width\t\t: " + square.getWidth());
            Console.WriteLine("Height\t\t: " + square.getheight());
            Console.WriteLine("Position\t: " + square.getPositionX() + "," + square.getPositionY());
            Console.WriteLine("Before Calculation");
            Console.WriteLine("Circumstance\t: " + square.getCircumtance());
            Console.WriteLine("Area\t\t: " + square.getArea());
            square.calculateArea();
            square.calculateCircumtance();
            Console.WriteLine("After Calculation");
            Console.WriteLine("Circumstance\t: " + square.getCircumtance());
            Console.WriteLine("Area\t\t: " + square.getArea());
       
        }
        static void Main(string[] args)
        {
            Square s1 = new Square(); // s1 is an instance of Class Square
            Square s2 = new Square(); // s2 is an instance of Class Square, note that s1 != s2
            Console.WriteLine("Before initialization");
            printProperties(s1, "s1");
            printProperties(s2, "s2");
            // initilize s1 and s2
            s1.setWidth(100);
            s1.setHeight(100);
            s1.setPosition(5, 10);
            s2.setWidth(150);
            s2.setHeight(50);
            s2.setPosition(15, 30);
            Console.WriteLine("After initialization");
            printProperties(s1, "s1");
            printProperties(s2, "s2");

            // edit s1 and s2
            s1.setWidth(200);
            s1.setHeight(100);
            s1.setPosition(10, 10);
            s2.setWidth(190);
            s2.setHeight(90);
            s2.setPosition(155, 20);

            Console.WriteLine("After edit");
            printProperties(s1, "s1");
            printProperties(s2, "s2");

            Console.ReadKey();

        }
    }
}


Java Code

Dalam mengimplementasikan di bahasa C# setidaknya harus ada 1 file untuk setiap class ditambah 1 file main untuk testing.  Maka setidaknya ada 3 file yang diperlukan untuk sesi ini.


Position.java
package javaimplementation;

/**
 *
 * @author Rohmad
 * @access public
 */
public class Position {
   
    // attributes set to private
    private int x;
    private int y;

    // methods set to public
    public Position() {
        this.x = 0;
        this.y = 0;
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return this.x;
    }

    public int getY() {
        return this.y;
    }
}


Square.java
package javaimplementation;

/**
 *
 * @author Rohmad
 * @access public
 */
public class Square {

    private int width;
    private int height;
    private int area;
    private int circumtance;
    private Position position;

    public Square() {
        this.position = new Position();
        this.area = 0;
        this.circumtance = 0;
        this.width = 0;
        this.height = 0;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public void setPosition(int x, int y) {
        this.position.setPosition(x, y);
    }

    public void calculateCircumtance() {
        this.circumtance = 2 * (this.width + this.height);
    }

    public void calculateArea() {
        this.area = this.width * this.height;
    }

    public int getWidth() {
        return this.width;
    }

    public int getheight() {
        return this.height;
    }

    public int getPositionX() {
        return this.position.getX();
    }

    public int getPositionY() {
        return this.position.getX();
    }

    public int getCircumtance() {
        return this.circumtance;
    }

    public int getArea() {
        return this.area;
    }
}
Main.java
package javaimplementation;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Rohmad
 */
public class Main {

    public static void printProperties(Square square, String instanceName) {
        System.out.println("Properties of " + instanceName);
        System.out.println("Width\t\t: " + square.getWidth());
        System.out.println("Height\t\t: " + square.getheight());
        System.out.println("Position\t: " + square.getPositionX() + "," + square.getPositionY());
        System.out.println("Before Calculation");
        System.out.println("Circumstance\t: " + square.getCircumtance());
        System.out.println("Area\t\t: " + square.getArea());
        square.calculateArea();
        square.calculateCircumtance();
        System.out.println("After Calculation");
        System.out.println("Circumstance\t: " + square.getCircumtance());
        System.out.println("Area\t\t: " + square.getArea());

    }

    public static void main(String[] args) {
        try {
            Square s1 = new Square(); // s1 is an instance of Class Square
                Square s2 = new Square(); // s2 is an instance of Class Square, note that s1 != s2
                System.out.println("Before initialization");
                printProperties(s1, "s1");
                printProperties(s2, "s2");
                // initilize s1 and s2
                s1.setWidth(100);
                s1.setHeight(100);
                s1.setPosition(5, 10);
                s2.setWidth(150);
                s2.setHeight(50);
                s2.setPosition(15, 30);
                System.out.println("After initialization");
                printProperties(s1, "s1");
                printProperties(s2, "s2");

                // edit s1 and s2
                s1.setWidth(200);
                s1.setHeight(100);
                s1.setPosition(10, 10);
                s2.setWidth(190);
                s2.setHeight(90);
                s2.setPosition(155, 20);

                System.out.println("After edit");
                printProperties(s1, "s1");
                printProperties(s2, "s2");

                System.in.read();
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Output

Area            : 7500
After edit
Properties of s1
Width           : 200
Height          : 100
Position        : 10,10
Before Calculation
Circumstance    : 400
Area            : 10000
After Calculation
Circumstance    : 600
Area            : 20000
Properties of s2
Width           : 190
Height          : 90
Position        : 155,155
Before Calculation
Circumstance    : 400
Area            : 7500
After Calculation
Circumstance    : 560
Area            : 17100

That's it today's tutorial. Offline Tutorial(.docx) plus Source in all Languages available in link below.
Source codes developed in Visual Studio 2010(C++ and C#) and Netbeans 7.1.2(Java)

Next Section will be available soon, so stay tuned :p
 
Copyright (c) 2010 printf("hello world"); and Powered by Blogger.