About Me

Wednesday, December 29, 2010

Why abstract method can't be private

Not so far ago I had to use abstract class for one business implementation.
I quickly typed the construction of abstract class and then found that the intelisense mark some code as invalid:
My first question was "Why?!".
Why abstract method can't be private ?

Here is the answer that came into my brain in the next second:

Abstract clause means that the method should be overriden in the classes that are inheriting from the base class.
In this case, each inheritor from Foo class should implement Method1, Method2 and Method3
Inheritor, can see only public and protected members of the base class. 
So, there is no way to implement Method3 because it marked as private.

No need to remember all the rules about all that OOP tricks in .NET, its only need to use your brain and ask "Why?" at the right moment. There is always logical explanation for it.

Monday, December 13, 2010

"Could not load file or assembly 'Castle.Core, Version=1.0.3.0 ...' or one of its dependencies...." issue

Today I got this error during configuring IoC container based on Windsor library.

We are working as team on this project, and when i got this error, i started to think that somebody mistakenly changed the version of the library.
After review, i found that all libraries has correct version. We are already using version 2.5.1.0 of that library and there are no places in the project's code or configuration files where it may referense to the old version of Core library.
I had to spend an hour to realize that the problem is not with version of the library but with components configuration.

We had to use forwarded types and some namespaces was specified wrong.
So, I've just changed a namespace for IReportRepository and IUserRepository to the correct one and it started working properly

Wednesday, December 1, 2010

How to write unit test for DateTime.Now

Yesterday I tried to use test driven development (TDD) to create logic for the application I'm working on.

One of requirements was to make the module to set the date when the object was modified.
The object has a property UpdatedOn and i needed to write a test that checks setting of DateTime.Now value for it.

The problem is, regular solution like the one below, will not work:


Assert.AreEqual(DateTime.Now, someObject.UpdatedOn);

The reason of why that example will always failed, is because the result of execution of DateTime.Now in Assert and DateTime.Now in business logic will be always different.
There will be few miliseconds between them and the test will always failed.

Here is what i used instead:


Assert.That(someObject.UpdatedOn, Is.EqualTo(DateTime.Now).Within(1).Seconds);


Get closest Monday SQL function

From time to time I have to build reports for the application I'm working on.
Today they asked me to build the report that can accept any date and build results within Monday to Sunday.

The problem was, how to find date of Monday, since the user may enter any week date.
So, for instance, if the user enters '12/03/10' , for instance, that Friday, the system should find date of Monday '11/29/10'. And so on...

I wrote small sql function that helps to get it:

if exists (select * from sysobjects where name = 'GetMonday')
    drop function GetMonday
go

create  function [dbo].[GetMonday](@date DateTime)
-- Returns closest Monday date that going before passed date
returns datetime
as
begin
    declare @datePart int
    set @datepart = datepart(weekday, @date )

    --in case if sunday treats the system as first day of the week,
    --convert passed sunday date into the last day of the week
    -- 12/26/10 was sunday, so we are testing first what day of the week it returns
    if (datepart(weekday, '12/26/10') = 1 AND @datepart = 1)
    SET @datepart = 8

    return dateadd(dd, (@datePart - 2) * -1, @date)
end
go

select dbo.GetMonday(getdate())