Archive

Archive for the ‘Software Development’ Category

PHP Class ‘Virtual’ Method using External File

March 5, 2012 Leave a comment

I learn that when we include external file within a class method, the file will run in the class’ method context thus it can access the private members of the class (using $this keyword). The included file can also have return keyword inside it.

This capability could be useful in a case like we have several classes that need to share same method, but we don’t want to put it in a parent class (for reason that we might encountering need a multiple inheritance feature), neithermore, to have it written in each classes.

File: index.php

<?php
abstract class AbstractClass
{
  public function sharedMethod()
  {
    $helper = new ClassHelper();
    return $helper->helperMethod($this);
  }
}

class ClassOne extends AbstractClass
{
  private $arg = 'this is class ONE.';

  public function classOneMethod()
  {
    return include('shared_method.php');
  }
}

class ClassTwo extends AbstractClass
{
  private $arg = 'this is class TWO.';

  public function classTwoMethod()
  {
    return include('shared_method.php');
  }
}

class ClassHelper
{
  public function helperMethod($caller)
  {
    // error:
    // $arg = $caller->arg;

    $arg = 'ClassHelper Helper Method Called, but I can\'t call the Caller private property :( ';
    return $arg;
  }
}

// program
$classone = new ClassOne();
$classtwo = new ClassTwo();
echo '<p>'.$classone->sharedMethod().'</p>';
echo '<p>'.$classtwo->sharedMethod().'</p>';
echo '<p>'.$classone->classOneMethod().'</p>';
echo '<p>'.$classtwo->classTwoMethod().'</p>';
?>

File: shared_method.php

<?php
$arg = $this->arg.' Shared Method Called! I am in the class context, so I can call private property :) ';
return $arg;
?>

For this example, we must use include rather than include_once, to make sure that everytime any class include this file it will be executed.

Result in browser:

ClassHelper Helper Method Called, but I can't call the Caller private property :( 
ClassHelper Helper Method Called, but I can't call the Caller private property :( 
this is class ONE. Shared Method Called! I am in the class context, so I can call private property :) 
this is class TWO. Shared Method Called! I am in the class context, so I can call private property :) 

This method might need a scripting language like PHP and not a valid Object-Oriented approach. I can’t really tell you when the above case will happen because it just a matter of my personal opinion right now to have the classes’ methods written as separate file. I think it could be handy in the project files not to maintain business rule inside one big class file.

This method also related to my previous post about actor-centered business logic. This way, the Actor Service could handle same request without having to share another parent class (they should already have one).

Categories: PHP MySQL

Actor-Centered Business-Logic

February 10, 2012 1 comment

Ketika merancang sebuah sistem informasi umumnya kita mengikuti pola 3-tiers:

  • Data Logic
  • Business Logic, dan
  • Presentation Logic
Ada beberapa pendekatan yang mungkin dilakukan dalam sebuah Business Logic. Pendekatan ini tidak dipengaruhi oleh satu jenis Pattern tertentu. Beberapa istilah berikut mungkin tidak ditemukan referensinya karena saya juga masih kesulitan mencari apa referensi padanannya (sekedar inovasi saja mungkin).
  1. Module-Centered Business-Logic adalah persepsi Business-Logic pada umumnya, saya definisikan ulang disini sebagai sebuah konsep logika yang menyusun kerangka suatu sistem kedalam modul-modul yang mandiri dengan pola pikir HAL APA SAJA yang ada dalam sistem tersebut. Contohnya: Modul Penjualan, Modul Pembelian, Modul Pengguna, Modul Keuangan, dan sebagainya.
  2. Actor-Centered Business-Logic saya definisikan sebagai sebuah konsep logika yang menyusun kerangka suatu sistem kedalam Aktor-Aktor mandiri dengan pola pikir SIAPA SAJA yang berada dalam sistem tersebut. User disini misalnya Aktor Guest, Actor Admin dan Aktor Member, dan lainnya jika ada. Dalam sistem berbasis web bisa dibilang jenis credential seorang pengunjung halaman pada saat itu.

Kalau dari diagramnya, terlihat Actor-Service mirip dengan Module namun terpisah secara logika bisnis. Tapi pola pikirnya tetaplah dengan Actor, bukan Module, karena kalau tetap Module maka rancangannya malah bisa menjadi module-centered generasi ke-0.

Jika diibaratkan sebuah sistem dengan pendekatan Module-centered seperti sebuah instansi yang loket-loket pelayanannya memiliki plang nama masing-masing departemennya. Ada Departemen Penjualan, Departemen Pembelian, Departemen Keuangan dan lain-lain. Cukup familiar bukan? Pengguna yang memiliki keperluan dapat mendatangi loket-loket yang bersangkutan. Idealnya, keperluan yang meliputi proses lintas departemen dapat dilayani di satu loket saja (sistem satu pintu). Orang telah berpikir bahwa kebutuhan internal harus dijalankan secara berbeda dari kebutuhan eksternal. Sehingga loket-loket dengan pendekatan ini diubah plang namanya menjadi, loket pengurusan tanah, loket pengurusan identitas, loket pengurusan pajak kendaraan dan lain-lain.

Pola pikir penulis sebelumnya masih berpusat pada pendekatan ini. Namun penulis merasa ada yang kurang tepat dalam pola pikir ini. Sekalipun nampak valid dalam cakupan perancangan sistem, ada ketidakselarasan yang terasa dalam proses pengembangan nyatanya. Salah satu masalah yang terjadi dalam proses pengembangan nyata adalah masalah pembagian tugas. Perancangan logika bisnis berbasis pendekatan ini penulis rasa juga menyulitkan dalam pembagian tugas dalam sebuah tim. Hal ini lebih cocok dihadapi dengan pendekatan jenis kedua (actor-centered).

Pendekatan Actor-Centered selayaknya sebuah instansi dengan loket-loket pelayanannya berupa orang-orang yang menjadi pendamping (-bukan perantara). kita istilahkan disini sebagai Agen. Misalnya ada agen untuk Pelanggan (Customer Service), agen untuk pengunjung baru (Receptionist), agen untuk rekanan (Sales and Marketing Agents), agen untuk internal (Office Boy/Girl). Contoh dalam sebuah aplikasi web adalah: Actor Guest, Actor Admin, dan Actor Member.

Pendekatan yang kedua ini bukanlah pengembangan atau penambahan dari pendekatan pertama. Artinya bukan sesuatu yang mungkin lebih baik. Perlu dipikirkan lebih lanjut. Cara kedua ini tidak saja hanya digunakan dalam memenuhi kebutuhan eksternal, pemenuhan kebutuhan internal juga dilayani seperti ini (sehingga tidak terjadi kerancuan dua pendekatan digunakan sekaligus). Hal ini bisa terjadi ketika daya bagi dan akses sumber daya (resource) sudah sangat cepat dan terbuka. Tidak lagi perlu dibagi menjadi departemen-departemen fisik yang awalnya untuk mengelola dokumen-dokumen fisik.  Sementara pemisahan logika sumber daya nantinya diserahkan pada lapisan Data Logic-nya. Hukum/aturan (business-rule) sejatinya tidak diterapkan pada APA, tetapi kepada SIAPA.

Manfaat lain yang mungkin bisa diperoleh dari pendekatan kedua adalah adanya konsistensi desain dari awal hingga akhir. Mengurangi missing-link dalam desain dan implementasi. Namun hal ini masih dipengaruhi lagi oleh dua lapisan logika lain nantinya. Kecap, kecap… :P

Categories: Web Development

Memqiu, PHP Memory Query Helper Using Sqlite

October 30, 2011 Leave a comment

I need a way to do an in memory sql query in PHP. Something like linq. Sqlite has an in memory database feature that exactly can do that.

This class is just a wrapper so that I can focus more in inputing and querying data rather than have to deal with the schema. The motivation is that using SQL statements, in my opinion, are ridiculously way more friendly in data filtering tasks rather than if we create separate functions in codes.

It goes like this..

Read more…

Categories: PHP MySQL

The Wonder Method in PHP

October 4, 2011 Leave a comment

This just for fun script…

Imagine when we create a mockup for front end script that use a back end class which the methods are not yet to be ready… After a while, back and forth changing editor’s tabs just to create an empty method in that class, we start wondering (thus make the title The Wonder Method) if there some mechanism to call the yet nonexistence method from our script… heck, I even want return value from it!! and as a bonus, execute it when it ready… is it too trivial? but there have to be! it’s php! or is it already something built-in? but anyway, now we have! :)

It make use the officially magic method __call in php that triggered when invoking inaccessible methods in an object context. Below is the example:

<?php
 class Animal
 {
   function __call($name, $arguments) {
     if(substr($name, 0, 5) == 'call_'){
       $name = substr($name, 5);
       if(method_exists($this, $name)){
         return call_user_func_array(array($this, $name), $arguments);
       }
       else{
         $argc = count($arguments);
         if($argc > 0){
           return $arguments[$argc - 1];
         }
        return null;
       }
     }
     else{
       trigger_error("Fatal error: Call to undefined method $name", E_USER_ERROR);
     }
    }
 }
 $animal = new Animal();
 $type = 'dog';
 echo $animal->call_showSound($type, 'the dog is barking wuff wuff (imaginary result)').'<br />';
 ?>

Here, we will havebelow as the result:

the dog is barking wuff wuff (imaginary result)

now add following method when we ready to made changes to the class:

public function showSound($type)
{
 switch($type){
 case 'dog': return "the dog is barking wuff wuff (real result)";
 case 'cat': return "the cat is miauwing miauwww (real result)";
 }
 return 'unknown animal (real result)';
}

Here, it should be return like this:

the dog is barking wuff wuff (real result)

Description, first in the __call method body, we inspect whether there are call to specific method name pattern for this wonder method we defined ourself (call_xxxxxx).

If the method is not existed yet, it will return the last argument as the mockup result from the real method later. As the method has exists, it will executed it and simulate a normal method call from the script. The wonder method name pattern can be useful when we want to keep track for clean up the code later.

I will left the implementation of this wonder thingy for what you think best… my guess, by not implement it at all… :P

Ok, that’s just about it! Happy coding everyone… :)

Categories: PHP MySQL

Catatan Manajemen Data Berdasarkan Environment

October 2, 2011 Leave a comment

Pertama-tama, saya membagi cara manajemen data menjadi 2 jenis:

  1. Pengelolaan secara Offline, misalnya file excel, csv
  2. Pengelolaan secara Online, misalnya RDBMS server

Pengelolaan diatas berarti melakukan aktifitas umum manajemen data seperti dibawah ini dimana masing-masing cara diatas memiliki kelebihan dan kekurangannya:

  • Membuat pengelompokkan data menjadi file atau tabel (cara Offline lebih simple)
  • Memasukkan data (cara Offline lebih simple)
  • Mengupdate data (cara Online lebih mudah)
  • Menghapus data (cara Online lebih mudah)
  • Memvalidasi data (cara Online lebih mudah)

Kedua metode diatas diakses menggunakan aplikasi kostum. Dengan demikian cara Offline cocok digunakan untuk data input saja, namun untuk tugas lainnya, saya lebih prefer menggunakan cara Online. Kelebihan Offline adalah cara input data yang sangat mudah di file excel atau csv, dan manajemen file dalam hirarki file sistem. Sedangkan cara Online (RDMS) kita dipusingkan oleh cara membuat tabel-tabel dalam skala database yang kadang perlu seorang database arsitek berpengalaman untuk membuat struktur data kita bagus.

Hal yang pernah saya lakukan adalah mencoba mengelola cara Offline secara online menggunakan aplikasi, namun hanya bagus untuk menampilkan saja, meskipun mengintegrasikannya kemudian ke server RDBMS tidak sulit, namun tetap memakan waktu.

Metode Alternatif

Menggunakan metode Hybrid adalah salah satu alternatif, yaitu menggunakan file database yang dapat diakses melalui perintah SQL, misalnya SQLite. Namun sekalipun dapat mengeliminasi kelemahan 2 metode lain, ia justru merupakan entitas asing di kedua environment tersebut. Di environment Offline, ia tidak cukup fleksibel untuk dikelola seperti halnya file dan di lingkungan Online, saya lebih memilih langsung dengan sebuah database server. Metode ini cocok memang untuk aplikasi Offline.

Metode lain yang paling tradisional, atau malah tidak tepat dibilang sebagai metode, adalah Integrasi. Metode ini bisa dikatakan memilih menggunakan cara yang paling mudah untuk sebuah environment untuk kemudian dibuat pola migrasi datanya. Menurut saya itu lebih baik jika kita tidak ingin bergantung pada suatu metode tertentu. Hal lain yang paling berperan adalah metode Integrasi adalah Controller/Driver. Untuk masing-masing metode yang hendak diintegrasikan, sebaiknya kita telah memiliki alat kontrol yang dapat digunakan untuk mengelola data sesuai fungsinya.

Tujuan

Meskipun masing-masing teknik sebenarnya memiliki kelebihan dan kekurangannya masing-masing. Tujuan dari catatan ini adalah hendak menemukan sebuah Pattern Normalisasi yang dapat diterapkan dalam RDBMS untuk mengelola data semudah dan secepat metode Offline.

Saya beranggapan bahwa konsep Normalisasi saat ini cukup baik namun tidak praktis sehingga muncul lagi teori denormalisasi dan sebenarnya tersebunyi di dalam logika kita sebuah Pattern Normalisasi lain (dengan konvensi penamaan dan peletakan tabel dan kolom) yang lebih tepat sehingga kita dapat memiliki struktur data relational yang dapat dikelola secara cross-domain hingga level tabel. Dimana distribusi pada level tabel menurut saya adalah yang paling moderat antara machine-friendly dan human-friendly dalam mengelola data (mungkin saat ini dalam ilmu database telah ditemukan model distribusi data hingga level kolom – noSQL?).

Categories: Software Development
Follow

Get every new post delivered to your Inbox.