[pkg-fso-commits] [SCM] FSO frameworkd Debian packaging branch, master, updated. milestone4-368-g700ab82

Michael 'Mickey' Lauer mickey at vanille-media.de
Mon Feb 2 18:52:07 UTC 2009


The following commit has been merged in the master branch:
commit f4df301382209fc9f89d83d4c924c649c10c0fc1
Author: Michael 'Mickey' Lauer <mickey at vanille-media.de>
Date:   Thu Jan 29 15:50:49 2009 +0100

    add null object

diff --git a/framework/patterns/null.py b/framework/patterns/null.py
new file mode 100644
index 0000000..8851ebe
--- /dev/null
+++ b/framework/patterns/null.py
@@ -0,0 +1,136 @@
+#!/user/bin/env python 
+
+"""null.py
+
+This is a sample implementation of the 'Null Object' design pattern.
+
+Roughly, the goal with Null objects is to provide an 'intelligent'
+replacement for the often used primitive data type None in Python or
+Null (or Null pointers) in other languages. These are used for many
+purposes including the important case where one member of some group 
+of otherwise similar elements is special for whatever reason. Most 
+often this results in conditional statements to distinguish between
+ordinary elements and the primitive Null value.
+
+Among the advantages of using Null objects are the following:
+
+  - Superfluous conditional statements can be avoided 
+    by providing a first class object alternative for 
+    the primitive value None.
+
+  - Code readability is improved.
+
+  - Null objects can act as a placeholder for objects 
+    with behaviour that is not yet implemented.
+
+  - Null objects can be replaced for any other class.
+
+  - Null objects are very predictable at what they do.
+
+To cope with the disadvantage of creating large numbers of passive 
+objects that do nothing but occupy memory space Null objects are 
+often combined with the Singleton pattern.
+
+For more information use any internet search engine and look for 
+combinations of these words: Null, object, design and pattern.
+
+Dinu C. Gherman,
+August 2001
+"""
+
+class Null:
+    """A class for implementing Null objects.
+
+    This class ignores all parameters passed when constructing or 
+    calling instances and traps all attribute and method requests. 
+    Instances of it always (and reliably) do 'nothing'.
+
+    The code might benefit from implementing some further special 
+    Python methods depending on the context in which its instances 
+    are used. Especially when comparing and coercing Null objects
+    the respective methods' implementation will depend very much
+    on the environment and, hence, these special methods are not
+    provided here.
+    """
+
+    # object constructing
+    
+    def __init__(self, *args, **kwargs):
+        "Ignore parameters."
+        return None
+
+    # object calling
+
+    def __call__(self, *args, **kwargs):
+        "Ignore method calls."
+        return self
+
+    # attribute handling
+
+    def __getattr__(self, mname):
+        "Ignore attribute requests."
+        return self
+
+    def __setattr__(self, name, value):
+        "Ignore attribute setting."
+        return self
+
+    def __delattr__(self, name):
+        "Ignore deleting attributes."
+        return self
+
+    # misc.
+
+    def __repr__(self):
+        "Return a string representation."
+        return "<Null>"
+
+    def __str__(self):
+        "Convert to a string and return it."
+        return "Null"
+
+    def __nonzero__(self):
+        "Return whether the object is nonzero."
+        return False
+
+
+def test():
+    "Perform some decent tests, or rather: demos."
+
+    # constructing and calling
+
+    n = Null()
+    n = Null('value')
+    n = Null('value', param='value')
+
+    n()
+    n('value')
+    n('value', param='value')
+
+    # attribute handling
+
+    n.attr1
+    n.attr1.attr2
+    n.method1()
+    n.method1().method2()
+    n.method('value')
+    n.method(param='value')
+    n.method('value', param='value')
+    n.attr1.method1()
+    n.method1().attr1
+
+    n.attr1 = 'value'
+    n.attr1.attr2 = 'value'
+
+    del n.attr1
+    del n.attr1.attr2.attr3
+
+    # representation and conversion to a string
+    
+    assert repr(n) == '<Null>'
+    assert str(n) == 'Null'
+    assert(not n, "n should return False.  i.e. I would expect same behavior as testing an empty list or string")
+
+
+if __name__ == '__main__':
+    test()

-- 
FSO frameworkd Debian packaging



More information about the pkg-fso-commits mailing list