Пишем код

Заметки о .net разработке

Generic-типы — это просто :)

without comments

    internal class ChooseServerStage : ActStageBase
    {
        public ChooseServerStage(FinderWrapper<RegionFinder<PixelCounterComparer<WhiteLetterColorPixelCriteria>>> finder)
            : base(finder)
        {
        }
    }

Дженерик-тип тройной вложенности в конструкторе :) Только что написал подобную конструкцию в своем собственном коде.

На самом деле, в каждом случае дженерик-тип представляет собой одну из зависимостей класса. То есть чаще всего это выглядит так:

public class PixelCounterComparer<T> : IImageComparer where T : IColorPixelCriteria {
    public PixelCounterComparer(PixelCounter pixelCounter,
                                T colorPixelCriteria) {
    }
}

Основной плюс подхода, как ни странно, это простота и очевидность (после привыкания к подобной конструкции :)). На примере PixelCounterComparer’a можно представить, как это реализовать по-другому:

public class PixelCounterComparer: IImageComparer {
    public PixelCounterComparer(PixelCounter pixelCounter,
                                IColorPixelCriteria colorPixelCriteria) {
    }
}

//тогда для использования в ChooseServerStage придется создать специальный класс вроде:
public class PixelCounterComparerForChooseServerStage: PixelCounterComparer {
    public PixelCounterComparerForChooseServerStage(PixelCounter pixelCounter,
                                WhiteLetterColorPixelCriteria colorPixelCriteria) 
           : base(pixelCounter, colorPixelCriteria)
    {
    }
}

//и конструктор ChooseServerStage станет выглядеть так:
public ChooseServerStage(FinderWrapper<RegionFinder<PixelCounterComparerForChooseServerStage>> finder)
            : base(finder)
        {
        }

Можно избавляться от дженериков и дальше, в итоге в зависимостях ChooseServerStage будет один простой класс, но чтобы понять, какими именно подклассами он «настроен» придется долго и муторно ковыряться в глубине наследований.
А так — меньше кода и больше очевидности :)

P.S. и да, FinderWrapper<RegionFinder<PixelCounterComparer<WhiteLetterColorPixelCriteria>>> finder очень легко и просто резолвится из IoC-контейнера.

Опубликовать в Facebook
Опубликовать в Google Plus

Written by Shaddix

Сентябрь 10th, 2011 at 2:01 пп

Posted in .net,IoC

Leave a Reply