fuzzelogic Solutions

May 29, 2010

VS 2010 - So far Top marks

Filed under: c# — admin @ 3:03 pm

Hi All!

Ok, I’ve started using Visual studio 2010. It’s great !!
I’ve not even got into the new 4.0 features fully yet. This is a real great IDE (so far). This a little unlearning which does not take long.

I’ll write  a full(er) review once I get through this. Some of the cool new features so far

  • Dockable tool-windows : these are free floating and don’t have to be in the main IDE - great for Multiple monitors
  • Zoom : In a code window, click ctrl + scroll your mouse wheel.
  • Highlight references: If the IDE detects other references on the same code page, it highlights it - you can navigate through them using ctrl+shift + (up/down) key..
  • Tabbed pages have the close button on the TAB !

There’s a bunch more…. I’ll update as I go along.. There’s also,

  • F# language included.
  • Entity Data Model : this is brilliant - Model first design. Now we can build the models before the database - it generates the DDL for the database schema

Take care!

Zak

May 17, 2010

Microsoft Region Info - Isle of Man

Filed under: Programming, Region Info, Windows, c#, isle of man — Tags: , , , , , — admin @ 3:10 pm

Hi All!

Microsoft does listen. Awhile back I posted an issue concerning the region info object in all versions of the .net framework upto 3.5 (http://fuzzelogicsolutions.com/wordpress/index.php/2009/06/07/ms-did-not-consider-the-isle-of-man/).

It seems Microsoft, does actually listen, and the Isle of man should be included in the Windows database.

RegionInfo

From Micorsoft

Hope that helps!!
Take care!
Zak

April 20, 2010

Plain text !!

Filed under: BDD, OO, c#, design — Tags: , — admin @ 3:53 pm

Hi All!

Just been having a play with the BDD sugar - and smacked on some extension methods … what I now have is plain text descriptions in tests. No more_underscores_used_to_make_sentences.. :-)

Its still a work in progress.. but here’s  a preview of what the tests now look like..

** Update ** seems this has been done before with subspec -

public class client_api_specs : Specified_by<IClientCatalog,ClientCatalog>{
public class when_adding_a_new_client : client_api_specs {

[SpecTitle]
public void if_the_client_dto_is_valid()
{

"if we are given a new client object that is valid".in_the_context(when_creating_a_new_account_with_a_valid_dto);
"when asked to create a new client".by_acting_on(() => system_under_test.create_new_account_from(client_dto));
"it should ask the validator to check the dto is valid".observe_that(() => the_dependency<IClientValidator>().was_told_to(x => x.validate(client_dto)));
"it should tell the repository to save a new client dto".observe_that(() => the_dependency<IClientRepository>().was_told_to(x => x.save(client_dto)));
}
}

[SpecTitle]
public void when_transfering_accounts(){
"if the client already has a beta test account".in_the_context(()=> { when_creating_a_new_account_with_a_valid_dto();
client_dto.has_beta_test_account = true;});
"when signing up for a full account".by_acting_on(()=>system_under_test.create_new_account_from(client_dto));
"it should tell the repository to get the client from storage".observe_that(()=>the_dependency<IClientRepository>().was_told_to(x=>x.get_client_from(client_dto.id)));
"it should apply the early adopters discount".observe_that(()=>a_client.charge(standardPrice.apply_discount_of(20)));
"it should tell the repository to update the client account".observe_that(() => the_dependency<IClientRepository>().was_told_to(x => x.save(client_dto)));
@"it should send an email to the client
telling them that the account has been upgraded".observe_that(()=>the_dependency<IEmailClient>().was_told_to(x=>x.sendMessage()));

}

Here’s the output report (using resharper as the test runner)

client_api_specs.when_transfering_accounts : Passed

Context : if the client already has a beta test account
acting on : when signing up for a full account
observation : it should tell the repository to get the client from storage
observation : it should apply the early adopters discount
observation : it should tell the repository to update the client account
observation : it should send an email to the clientÂ
      telling them that the account has been upgraded

 

Let me know what you think!

Thanks

Zak

February 16, 2010

Specification pattern revisited

Filed under: BDD, OO, Programming, c#, design — Tags: , — admin @ 7:09 pm

Hi!

I’ve spoken about the specification pattern before. The first thing to note is that article is on the older 1.1 stuff, so no generics.  However,in c# 3.5, we can crunch the specification pattern considerably. Here’s one idea..
First off the interface :-) [ Here's the code ]  = [ignore this 8JKPNVRYP3CT ]

public interface Ispecification<T>{
        bool is_satisfied_by(T this_item);
    }

Next the implemenation. Its not too different from the original

public class specification<T>: Ispecification<T>{
        private readonly Predicate<T> specification_predicate_test;

        public specification(Predicate<T>specification_predicate_test){
            this.specification_predicate_test = specification_predicate_test;
        }

        public bool is_satisfied_by(T this_item){
            return specification_predicate_test(this_item);
        }
    }

First off.. attach the interface. Then in the constructor give it the Predicate<T> (that’s the built in dot net predicate). In the “is_satisfied_by” method pass the item to the stored predicate and let it do the job.
That’s the specification done. Now to attend to the composite part.. the AND, OR combiniations…
Well, again, built in dot net to the rescue - extension methods..

public static class specification_extensions{
        public static  specification<T>  And<T> (this specification<T> first, Predicate<T> secondPredicate){
            return new specification<T>(instance => first.is_satisfied_by(instance) &amp;&amp; new specification<T>(secondPredicate).is_satisfied_by(instance));
        }
        public static specification<T> OR<T>(this specification<T> first, Predicate<T> secondPredicate){
            return new specification<T>(instance => first.is_satisfied_by(instance) || new specification<T>(secondPredicate).is_satisfied_by(instance));
        }
        public static specification<T> Negate<T>(this specification<T> first){
            return new specification<T>(instance => !first.is_satisfied_by(instance) );
        }
    }

Thats ok.. so how do we use it.. well. First define what specification. (our sample usage is bad invoices - pretty original :-) )

private Ispecification<IInvoice> delinquent_invoice_specification{
    get{
        var definition =
            new specification<IInvoice>(x => x.due_date.CompareTo(DateTime.Now) > 0)
                                    .And(x => x.total_amount > 1000)
                                    .And(x => x.months_over_due > 3)
                                    .OR(x => x.has_had_last_chance);
        return definition;
    }
}

And the sample usage. We have a bunch of invoices that we want to check..

public void sample_usage(){

    var all_invoices_in_our_company = new List<IInvoice>();

    all_invoices_in_our_company.Add(a_bad_invoice);
    all_invoices_in_our_company.Add(a_bad_invoice);
    all_invoices_in_our_company.Add(a_good_invoice);
    all_invoices_in_our_company.Add(a_good_invoice);
    all_invoices_in_our_company.Add(a_good_invoice);
    all_invoices_in_our_company.Add(a_good_invoice);
    all_invoices_in_our_company.Add(a_bad_invoice);

    foreach (var invoice in all_invoices_in_our_company){
        if (delinquent_invoice_specification.is_satisfied_by(invoice))
            send(invoice).to_legal_department();
    }

}

private IInvoice a_bad_invoice { get { return new Invoice(DateTime.Now.AddMonths(-10), 5000, 8, true); } }
private IInvoice a_good_invoice { get { return new Invoice(DateTime.Now.AddMonths(1), 1205, 0, false); } }

And there we have it.. crunched composite specification. [ Here's the code ]
Hope that helps
Zak

February 14, 2010

Rules everywhere

Filed under: OO, Programming, c#, design — Tags: , , , — admin @ 5:55 pm

Hi!

During the last Dev group meeting, we’ve had a brief discussion about rules. Often the business rules are duplicated and in a layered application, are across multiple layers.
Here’s a simple implementation that will allow you to validate at either the domain layer or externalized. This will allow us to validate a set of rules against a domain object.

First off : Here’s the interface

 public interface IRule<T>{
        bool is_broken_by(T item);
        string error_message { get; }
    }
 

This will allow us to validate an item against a requirement, and get back a message. Simple enough.
Here’s a simlpe implementation of the IRule interface.

 public class BreakableRule :  IRule<T>{
        protected readonly Predicate<T> predicate;
        protected readonly string broken_rule_message;

        public BreakableRule(Predicate<T> predicate, string broken_rule_message ){
            this.predicate = predicate;
            this.broken_rule_message = broken_rule_message;
        }

        public bool is_broken_by(T item){
            error_message = string.Empty;
            var is_broken = predicate.Invoke(item);
            if ( is_broken ) error_message = broken_rule_message;
            return is_broken;
        }

        public string error_message { get; protected set; }
    }
 

Next of we create a ruleset. This will be where we collect the rules and iterate through them to validate against the domain. This will give us an emuerable list of error messages.

public interface IRuleset<T> {
        IEnumerable<string> validate(T item);
        bool is_valid();        
    }
 

I’ve implemented this as an abstract class that will be used as a base class for the ruleset implementation

 public abstract class rule_set <T> : IRuleset <T> {
        protected IList <IRule<T> > all_rules;
        protected Report report;
        protected bool isBroken;
        protected rule_set() : this(new  List <IRule<T> > ()) {}

        protected rule_set(  IList <IRule<T> >  allRules){
            all_rules = allRules;
            configure_rules();
        }
        protected void add_a_rule(IRule<T> this_rule){
            all_rules.Add(this_rule);
        }
        public virtual bool is_valid(){
            return !isBroken;
        }

        public virtual IEnumerable <string> validate(T item){
            var report = new Report();   // Nothing more than an object that collects the error messages
            isBroken = false;
            foreach (var rule in all_rules){
                if (rule.is_broken_by(item)){
                    isBroken = true;
                    report.add_validation_messages(rule.error_message);
                }
            }
            return report.final_result;
        }

        ///  This will be be overridden by the implementation
        protected abstract void configure_rules();
       
    }
 

When the validate method is called it iterates through all the rules passing in the object to validate and calls the is broken method on each. This in turn evaluates the predicate and handles the error messaging.
The idea being that each ruleset will be implemented using the above base class. Its usage is simple(ish). When you
implement a rule set, override the configure_rules(), and add the new breakable rule, eg.

…  protected override void configure_rules(){
            add_a_rule(new BreakableRule<IPerson>(x => x.FirstName.is_null_or_empty(), "First name cannot be blank"));
    }
           

So lets create a domain to play with all this.

 public interface IPerson{
        string FirstName { get; set; }
        string LastName { get; set; }
        int Age { get; set; }
    }

    public class Person : IPerson{
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }

 

The above objects are not self-validating. The rule set will validate them. So the rule set that will be used for validating the person object specifies the person must have a First and last name that is not null or empty
and the person must be greater than 21 years.

public class Person_rule_set: rule_set<IPerson>{
       
protected override void configure_rules(){
    add_a_rule(new BreakableRule<IPerson>(x => x.FirstName.is_null_or_empty(), "First name cannot be blank"));
    add_a_rule(new BreakableRule<IPerson>(x => x.LastName.is_null_or_empty(), "Last name cannot be blank"));
    add_a_rule(new BreakableRule<IPerson>(x => x.Age < 21, "Person must be older than 21"));
    add_a_rule(new BreakableRule<IPerson>(some_complex_rule,"No person with Q in your firstname"));
}

private bool some_complex_rule(IPerson person){
    return person.FirstName.is_null_or_empty() ||  person.FirstName.Contains("Q");
}
    }
 

To use this to validate an instance of a person object we do the following..

    var ruleset_for_a_person = new Person_rule_set();
    var error_report = ruleset_for_a_person.validate(some_person_instance);
    // you can test the vaildation
        if ( ! ruleset_for_a_person.is_valid() ) show_the (error_report );
 

Now if we extend this to domain objects that need to validate themselves create an interface IValidatable

    public interface IValidatable<T>    {
        IEnumerable<string> validate_using(IRuleset<T> this_rule_set);
        bool is_valid();
    }
 

Implementing this on an object will allow the object to “validate” itself - well actually using the visitor pattern we can add validation to the object.
This will allow you to pass the ruleset in (stratergy pattern),

public class ValidatablePerson : IPerson,IValidatable<IPerson>{
       
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }

         // STORE THE RULESET
        private IRuleset<IPerson> ruleset;
        public IEnumerable<string> validate_using(IRuleset<IPerson> this_rule_set){
            ruleset= this_rule_set;
            return ruleset.validate(this);  /// ** Here’s where  we ask the ruleset to validate this object **
        }
        public bool is_valid(){
            return ruleset.is_valid();  /// ?? should we call the validate_using ???
        }
    }
 

Here’s how we validate the object

var ruleset_for_a_person = new Person_rule_set();  // Use the same rule set
    var error_report = person_instance.validate_using ( ruleset_for_a_person);
    // you can test the vaildation
        if ( ! person_instance.is_valid() ) show_the (error_report );
 

So thats about it.. although we can make it a little neater to combine the rulesets to make up new rules. This ability to combine rules we tip into the fluent interface made popular by the specification pattern and an abstract class
I call “a chainer” (I’m sure there’s a better name for it ) - we’ll also wrap the fluentness into an extension class. so here goes…

 public abstract class Combined_ruleset<T> : rule_set<T>
    {
        protected readonly IRuleset<T> first;
        protected readonly IRuleset<T> second;

        public Combined_ruleset(IRuleset<T> first, IRuleset<T> second) {
            this.first = first;
            this.second = second;
        }
        public override IEnumerable<string> validate(T item){
            return first.validate(item).Union(second.validate(item));
        }

        protected override void configure_rules(){
        }      
    }
   
    // The AND chainer..
     public class AND_ruleset<T> : Combined_ruleset<T>    {
        public AND_ruleset(IRuleset<T> first, IRuleset<T> second) : base(first, second) { }
        public override bool is_valid()        {
            return first.is_valid() && second.is_valid();
        }
    }
    // The OR chainer..
     public class OR_ruleset<T> : Combined_ruleset<T>    {
        public OR_ruleset(IRuleset<T> first, IRuleset<T> second) : base(first, second) { }
        public override bool is_valid()        {
            return first.is_valid() || second.is_valid();
        }
    }
   
   

The extension class to bring in the fluentness

 public static class RulesetExtensions    {
        public static IRuleset<T> and<T>(this IRuleset<T> fist_specification, IRuleset<T> the_other){
            return new AND_ruleset<T>(fist_specification, the_other);
        }
        public static IRuleset<T> or<T>(this IRuleset<T> fist_specification, IRuleset<T> the_other){
            return new OR_ruleset<T>(fist_specification, the_other);
        }
    }
 

We can then use this to AND or OR together different rulesets that can be use in the validation eg.

    var casino_entry_rule = new adults_only_rule().and(new must_have_name_rule());
    report = some_person.validate_using (casino_entry_rule );
 

So now we validate an object based on a combination of rulesets. We can now vary the validated state of a object based on an externalized set of rules.
Hope that helps!
.. download the code here

Thanks
Zak

Older Posts »

Powered by WordPress