Thanks to Ruby powerful meta programming capability and Rails delegate syntax, we can easily write graceful singleton class which makes the class works like a instance.
In traditional language such as C#, usually we write singleton code like this:
Singleton in C##
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Foo
{
// Singleton Declaration
privatestatic readonly Foo instance;
pubilc static Foo Instance
{
get
{
if(instance == null)
{
instance = new Foo();
}
return instance;
}
}
// Define instance behaviors
// ...
}
The previous approach works fine but the code that uses Foo will be kind of ugly. Every time when we want to invoke the method Bar on Foo, we need to write Foo.Instance.Bar() rather than more graceful way Foo.Bar(). To solve this problem we need implement the class in this way:
Class Delegation in C##
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Foo
{
// Singleton Declaration
// ...
// Define instance behaviors
publicvoidBar()
{
// Bar behaviors
// ...
}
publicstaticvoidBar()
{
Instance.Bar();
}
publicstring Baz
{
get { /* Getter behavior */ }
set { /* Setter behavior */ }
}
publicstaticstring Baz
{
get { return Instance.Baz; }
set { Instance.Baz = value; }
}
}
This approach simplified the caller code but complicated the declaration. You can use some trick such as Code-Snippet or code generating technology such as Text Template or CodeSmith to generate the dull delegation code. But it is still not graceful at all.
If we write same code in ruby, things become much easier, great thanks to Ruby’s powerful meta programming capability.
So in ruby solution we just use one statement delegate *Foo::Base.instance_methods, :to => :instance then delegate all methods defined in base to instance.
Besides this solution, there is also another kind of cheaper but working solution:
Singleton in Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# foo.rb
classFoo
autoload :Base
include Base
extend Base
end
# foo/base.rb
moduleFoo::Base
# Define instance behaviors
# ...
end
Two different approaches make the code behaves slightly different, but anyway they both works.
In Node.js world, we usually encapsulate a service into a module, which means the module need to export the façade of the service. In most case the service could be a singleton, all apps use the same service.
But in some rare cases, people might would like to create several instances of the service ,which means the module also need to also export the service constructor.
A very natural idea is to export the default service, and expose the constructor as a method of the default instance. So we could consume the service in this way:
Ideal Usage
1
2
var defaultService = require('service');
var anotherService = service.newService();
So we need to write the module in this way:
Ideal Export
1
2
3
4
5
functionService() { }
module.exports = new Service();
moudle.exports.newService = Service;
But for some reason, node.js doesn’t allow module to expose object by assigning the a object to module.exports. To export a whole object, it is required to copy all the members of the object to moudle.exports, which drives out all kinds of tricky code. I misunderstood how node.js require works, and HERE is the right understanding. Even I misunderstood the mechanism, but the conclusion of this post is still correct. To export function is still a more convenient way to export both default instance and the constructor.
And things can become much worse when there are backward reference from the object property to itself. So to solve this problem gracefully, we need to change our mind. Since it is proved that it is tricky to export a object, can we try to expose the constructor instead?
Then answer is yes. And Node.js does allow we to assign a function to the module.exports to exports the function. So we got this code.
Export Constructor
1
2
functionService() { }
module.exports = Service;
So we can use create service instance in this way:
Create Service
1
2
var Service = require('service');
var aService = new Service();
As you see, since the one we exported is constructor so we need to create a instance manually before we can use it. Another problem is that we lost the shared instance between module users, and it is a common requirement to share the same service instance between users.
How to solve this problem? Since as we know, function is also kind of object in javascript, so we can kind of add a member to the constructor called default, which holds the shared instance of the service.
This solution works but not in a graceful way! A crazy but fancy idea is that can we transform the constructor itself into kind of singleton instance??!! Which means you can do this:
Export Singleton
1
2
3
4
var defaultService = require('service');
defaultService.foo();
var anotherService = service();
anotherService.foo();
The code style looks familiar? Yes, jQuery, and many other well-designed js libraries are designed to work in this way. So our idea is kind of feasible but how?
Great thank to Javascript’s prototype system (or maybe SELF’s prototype system is more accurate.), we can simply make a service instance to be the constructor’s prototype.
Actual Export
1
2
3
functionService() { }
module.exports = Service;
Service.__proto__ = new Serivce;
Sounds crazy, but works, and gracefully! That’s the beauty of Javascript.
Where to store the Singleton View Model in WPF application, there are 2 common options:
Store in Resource Dictionary.
UI Designers prefers to store the WPF View Model into the Resource Dictionary because the objects in Resource Dictionary can be easily referenced in XAML. But Developers must hate that way very much! To fetch the object in Resource Dictionary from code behind must call the “FindResource” method of DependencyObject. And codes with tons of calls to “FindResource” method are ugly and very low efficient. The situation is worse since the accessibility to object in resource dictionary is also constrained by the Resource Scope, which means it is almost impossible to fetch the object from business logic.
Store in the Static Class.
I preferred to store the View Model in static class which is available globally. Developer can fetch the object by calling the static method, and designer also can fetch the object by using {x:Static} psudo-tag. But it is still inconvenient somehow for designer, and it is somehow hard to provide design-time mockup data in this way.
For the previous 2 solutions, the pros and cons are obvious. But is it possible to combine these 2 approaches together to gains all the advantages but all the disadvantages. The answer is Self-Registration Pattern.
The basic idea for Self-Registration Pattern is simple. It is obvious that we prefers to store the view models in Resource Dictionary, but we also want to access that object from Code Behind by calling static method.
You can see, the ViewModel has a globally visible static property named Default, and the class set the Default property to itself in its constructor. Which means once the View Model is initialized in Resource Dictionary, it also set the instance reference to Default, So designer can reference the view model easily with StaticResource Tag
Reference View-Model from XAML
1
<ControlProperty="{StaticResource ViewModel}"/>
And Developer also can access the view model by calling Static Property