Thursday, September 20, 2007

The Scientific Method of Programming

The scientific method is a body of techniques for investigating phenomena, acquiring new knowledge, or correcting and integrating previous knowledge. The emphasis of the method has always been on seeking truth! The method consists of a series of steps that will show that what we believe to be true is actually true. The steps are shown below:

  1. Define the question.
  2. Gather information and resources (observe).
  3. Form hypothesis.
  4. Perform experiment and collect data.
  5. Analyze data.
  6. Interpret data and draw conclusions that serve as a starting point for new hypotheses.
  7. Publish results.
  8. Retest (frequently done by other scientists).
So how does this relate to programming?
  1. Identify the need.
  2. Identify the task, talk to information holders, disect the problem.
  3. Set up assertions and tests.
  4. Write the code and run the tests.
  5. Validate the tests.
  6. Did the tests pass? Where the assertions correct? If not, correct it.
  7. Publish results (frequently done by Cruise Control).
  8. Retest (frequently done by Cruise Control).
The scientific method of programming is known by another name. It is Test Driven Development or TDD for short.

Tuesday, September 11, 2007

Combining DataTriggers and Property Triggers in WPF

How to combine property-triggers and data-triggers in WPF is not quite clear from the documentation.

Property-trigger that changes the color of a buttons background

A property-trigger is a trigger that works with the visisble element properties of WPF. Button has among others an IsMouseOver-property.

<Style TargetType="{x:Type Button}">
 <Setter Property="Button.Background" Value="AliceBlue" />
 <Style.Triggers>
  <Trigger Property="IsMouseOver" Value="True">
   <Setter Property="Button.Background" Value="Yellow" />
  </Trigger>
 </Style.Triggers>
</Style>

Data-trigger that changes the color of a buttons background

A data-trigger is a trigger that works with the properties of my own objects. My user object below has a Name and a Role property.

public class User {
    private string name;
    private string role;

    public string Name {
        get { return name; }
        set { name = value; }
 }

    public string Role {
        get { return role; }
        set { role = value; }
    }
}

<Style TargetType="{x:Type Button}">
 <Style.Triggers>
  <DataTrigger Binding="{Binding Path=Role}" Value="Admin">
   <Setter Property="Button.Background" Value="Red" />
  </DataTrigger>
 </Style.Triggers>
</Style>

A combined property-trigger and a data-trigger that changes the color of a buttons background

If I want to combine the two triggers above to check if the role is admin and the mouse is over there is no straightforward way to do this, so I have to resort to this.

<Style TargetType="{x:Type Button}">
 <Style.Triggers>
  <MultiDataTrigger>
   <MultiDataTrigger.Conditions>
    <!-- This binding refers to the actual WPF element. -->
    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
    <Condition Binding="{Binding Path=Role}" Value="Admin"/>
   </MultiDataTrigger.Conditions>
   <Setter Property="Button.Background" Value="Orange" />
  </MultiDataTrigger>
 </Style.Triggers>
</Style>