Design Patterns – Is Singleton pattern evil?

To hell with everything. Why the hell use singleton or even why the hell it is described as a pattern by GOF?

I don’t know. I have been reading, studying and even trying to code and use the same design patterns in real life. The very first and easy to understand pattern is Singleton. This pattern was defined/recognised/identified as a pattern which assures creation of one and only object throughout the life cycle of a program. Common or say classic example given is error logging mechanism. And that’s the only real world example. Rest of the examples such as file or database handles are not suitable examples. They can be said as good example but not perfect.

Why singleton is evil?

I don’t want to reinvent wheel. There are n number of reasons. The reason I found is, tight coupling. Coupling in OOPS or even Software Development is discouraged. Loosely coupled systems allow more robust testing. You can replace the modules with dummy modules, equivalent modules and test the system. In this scenario a file logging mechanism is a perfect example of singleton pattern. The mechanism can be file logger, database logger or any other logger and will not affect our system if we replace it. Coz its not tightly coupled to system. Or as I read some where it simply “gets” the information and doesn’t “set” anything in our system. On the other side a database layer can’t be singleton pattern. What if I replace my MySQL layer with PGSQL? The system may not perform as expected or worst may break.

I suggest using singleton pattern shamelessly if your system is going to be a very tightly coupled and is custom and specific to a requirement. My argument is performance counts more than portability. Ofcourse Bullet 350 is no match to Splendor and Splendor is no match to Bullet 350. So, singletons are evil but so is fire, if you use it to burn your neighbour’s house. Use fire to light up. Use singleton wisely. 🙂

Interfaces versus Abstract classes in PHP

Interfaces and abstract classes are similar because neither one can be used directly to instantiate an object. The key difference is that an abstract class can have some fully implemented methods, whereas interfaces just have method declarations. Use abstract classes when you want to maintain the same methods in all your subclasses but have some general functionality that can be shared by the subclasses. Use interfaces when the implementations will differ across most or all the methods in subclasses.

Edited on 12th December @ 13:00 Hrs
More differences are as follows:

  • Interfaces provide a form of multiple inheritance. A class can extend only one other class.
  • Interfaces are limited to public methods and constants with no implementation. Abstract classes can have a partial implementation, protected parts, static methods, etc.
  • A Class may implement several interfaces. But in case of abstract class, a class may extend only one abstract class.
  • Interfaces are slow as it requires extra indirection to to find corresponding method in in the actual class. Abstract classes are fast.

Similarities:

  • Neither Abstract classes or Interface can be instantiated.

Edited (again :-/ ) on 16th Dec @ 16:40 Hours IST

When to use what?

  • Use Abstract class for creating a bond between similar items like Splendor and Bullet 350 are similar entities, motor bikes, so extend them from abstract class like Bike.
  • Use interface for creating a bond between dissimilar items like Splendor and Civic are different from Bike but both are vehicles, have engine, have mileage, have wheels, consume fuel, and so many common behaviors.
  • Always try to use Abstract class or interface whenever you need to up-cast them to achieve simplicity e.g. accelerate and brake methods of bikes.

(not so) Short and (but still) sweet. 🙂

Forcing browser to show file download prompt for html file – The Content-Disposition Header Field

I came across an interesting post title how to use PHP/Perl to display JavaScript. Interesting in the sense that author have displayed a nice way to dump JavaScript. I have another way of doing the same. I will simply save a JS file as a PHP file and will add some header statements on top of it and will use this PHP file as a JS source file wherever I want. This way I can take advantage of environment variable or some other setting. Its not rocket science. But header can do a lot. Look at the following example.

  <?php
$examplFiles = array(
array('name'=>'an-html-doc.html', 'mimeType'=>'text/html', 'disposition'=>'inline'),
array('name'=>'an-html-doc.html', 'mimeType'=>'text/html', 'disposition'=>'attachment'),
);
$id = $_GET['id'];
if(isset($examplFiles[$id]) && file_exists($examplFiles[$id]['name'])){
header('Content-Type: '.$examplFiles[$id]['mimeType']);
header('Content-Disposition: '.$examplFiles[$id]['disposition'].'; filename='.$examplFiles[$id]['name']);
ob_clean();
flush();
readfile($examplFiles[$id]['name']);
exit;
}else{
echo 'Error 404, file not found!';
}

Save this file on your LAMP stack with a name, say “a-cool-php-script.php” and access it through your browser with some id passed to it. Of course you also need to create an html file and named “an-html-doc.html” to run this script or all you will get is 404 error. For id=0 the html file will be displayed in browser and for 1 you will be presented with a file download dialog box or prompt.

Isn’t this interesting. You an use this simple code snippet to check any kind of file. All you need to know is MIME type of the file. A list of MIME types can be found here.

The example is in PHP but same will work for any web scripting language. For more read RFC 2183.

made “foreach”

This may sound obvious but I still want to mention it 😀

<?php
$a = array(
1=>'B',
2=>'C',
3=>'D',
0=>'A',
4=>'E',
);
echo "Using for\n";
$c = count($a);
for($i=0;$i<$c;$i++){
    echo $a[$i],"\n";
}
echo "Using foreach\n";
foreach($a as $k){
    echo $k, "\n";
}
?>
Output is

Using for
A
B
C
D
E
Using foreach
B
C
D
A
E