۱۳۹۰/۰۸/۱۹

آشنايي با Refactoring - قسمت 13


يكي از مواردي كه حين كار كردن با iTextSharp واقعا اعصاب خردكن است، طراحي نامناسب ثوابت اين كتابخانه مي‌باشد. براي مثال:


public class PdfWriter
{
        /** A viewer preference */
        public const int PageLayoutSinglePage = 1;
        /** A viewer preference */
        public const int PageLayoutOneColumn = 2;
        /** A viewer preference */
        public const int PageLayoutTwoColumnLeft = 4;
        /** A viewer preference */
        public const int PageLayoutTwoColumnRight = 8;
        /** A viewer preference */
        public const int PageLayoutTwoPageLeft = 16;
        /** A viewer preference */
        public const int PageLayoutTwoPageRight = 32;

        // page mode (section 13.1.2 of "iText in Action")
        
        /** A viewer preference */
        public const int PageModeUseNone = 64;
        /** A viewer preference */
        public const int PageModeUseOutlines = 128;
        /** A viewer preference */
        public const int PageModeUseThumbs = 256;
        /** A viewer preference */
        public const int PageModeFullScreen = 512;
        /** A viewer preference */
        public const int PageModeUseOC = 1024;
        /** A viewer preference */
        public const int PageModeUseAttachments = 2048;

        //...
        //...
}

6 ثابت اول مربوط به گروه PageLayout هستند و 6 ثابت دوم به گروه PageMode ارتباط دارند و اين كلاس پر است از اين نوع ثوابت (اين كلاس نزديك به 3200 سطر است!). اين نوع طراحي نامناسب است. بجاي گروه بندي خواص يا ثوابت با يك پيشوند، مثلا PageLayout يا PageMode، اين‌ها را به كلاس‌ها يا در اينجا (حين كار با ثوابت عددي) به enum‌هاي متناظر خود منتقل و Refactor كنيد. مثلا:

public enum ViewerPageLayout
{
     SinglePage = 1,
     OneColumn = 2,
     TwoColumnLeft = 4,
     TwoColumnRight = 8,
     TwoPageLeft = 16,
     TwoPageRight = 32
}

مزيت‌ها:
- طبقه بندي منطقي ثوابت در يك enum و گروه بندي صحيح آن‌ها، بجاي گروه بندي توسط يك پيشوند
- استفاده بهينه از intellisense در visual studio
- منسوخ سازي استفاده از اعداد بجاي معرفي ثوابت خصوصا عددي (در اين كتابخانه شما مي‌توانيد بنويسيد PdfWriter.PageLayoutSinglePage و يا 1 و هر دو صحيح هستند؛ اين خوب نيست. ترويج استفاده از اصطلاحا magic numbers هم حين طراحي يك كتابخانه مذموم است.)
- كم شدن حجم كلاس اوليه (مثلا كلاس PdfWriter در اينجا) و در نتيجه نگهداري ساده‌تر آن در طول زمان