csharp

ده نکته کلیدی برای برنامه نویسان سی شارپ

2 minutes, 47 seconds Read

در این پست از وبسایت پرووید در رابطه با آموزش ده نکته کلیدی برای برنامه نویسان سی شارپ صحبت خواهیم کرد. سی شارپ یک زبان برنامه نویسی ساده و در عین حال قدرتمند و شی گرا می باشد.

سی شارپ یک زبان برنامه نویسی ساده و در عین حال قدرتمند و شی گرا می باشد. در رابطه با مفهوم شی گرایی در آموزش شی گرایی OOP در سی شارپ از وبسایت پرووید بیشتر صحبت کرده ایم. با استفاده از زبان سی شارپ می‌توان گستره وسیعی از نرم افزار ها را از جمله نرم افزارهای تحت وب، نرم افزار های تحت ویندوز، نرم افزار های کنسولی و حتی نرم افزارهای دستگاه‌ های موبایل را با استفاده از ویژوال استودیو ساخت. در رابطه با استفاده از ویژوال استودیو برای ساخت برنامه ها با زبان سی شارپ در آموزش کار با ویژوال استادیو برای ساخت برنامه های دات نت از وبسایت پرووید بیشتر صحبت کرده ایم. علاوه بر این، در رابطه با ساخت برنامه های اندروید و iOS با استفاده از سی شارپ آموزش پروژه محور و پیشرفته ی اپلیکیشن های موبایل با Xamarin.Forms وبسایت پرووید را به شما پیشنهاد می کنیم. ضمناً توصیه می کنیم که از آموزش رایگان برنامه نویسی با زبان سی شارپ نیز دیدن کنید.

حتماً برای متدها غیر عمومی (Non-Public) کلاس های خود Unit Test بنویسید.

به عنوان اولین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که حتماً برای متدها غیر عمومی (Non-Public) کلاس های خود Unit Test بنویسید.

البته نوشتن Unit Test برای متدهای غیر عمومی ممکن است کار بیهوده ای به نظر برسد چرا که متدهای غیر عمومی از بیرون از کلاس نمی توانند مورد دسترسی قرار بگیرند. با انجام یک کار ساده می توانید اعضای internal یک اسمبلی را برای بقیه ی اسمبلی ها قابل مشاهده کنید. کافی است که در فایل AssemblyInfo.cs دستور زیر را وارد کنید:

//Make the internals visible to the test assembly
[assembly: InternalsVisibleTo("MyTestAssembly")]

در این قسمت فرض شده است که نام اسمبلی هدف MyTestAssembly است. این کد باعث می شود که اعضای internal اسمبلی برای بقیه ی اسمبلی ها قابل مشاهده باشد. بنابراین، نوشتن Unit Test ها دیگر بیهوده و غیرضروری به نظرم نمی رسد.

از Tuple ها استفاده کنید.

به عنوان دومین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که از Tuple ها استفاده کنید. اغلب اوقات دیده می شود که برنامه نویسان برای برگرداندن چند شی مختلف از یک کلاس دست به تعریف POCO کلاس هایی می زنند که بدون شک نیازی به تعریف آنها نیست. در این رابطه در بسته ی آموزش شی گرایی OOP در سی شارپ بیشتر صحبت کرده ایم.

Tuple ها از دات نت فریم ورک 4 معرفی شدند و به راحتی می توانید از آنها برای برگرداندن چند شی از یک کلاس استفاده کنید. به کد زیر دقت کنید:

public Tuple<int, string, string> GetEmployee()
{
    int employeeId = 1001;
    string firstName = "Rudy";
    string lastName = "Koertson";

    //Create a tuple and return
    return Tuple.Create(employeeId, firstName, lastName);
}

از کالکشن های غیرضروری و موقتی استفاده نکنید و بیشتر به استفاده از کلیدواژه ی yield فکر کنید.

به عنوان سومین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که از کالکشن های غیرضروری و موقتی استفاده نکنید و بیشتر به استفاده از کلیدواژه ی yield فکر کنید.

اغلب اوقات برای خواندن عناصر یک کالکشن ممکن است دست به تعریف یک کالکشن موقتی دیگر بزنیم تا دده های خوانده شده را در خود نگه دارد. به کد زیر دقت کنید:

public List<int> GetValuesGreaterThan100(List<int> masterCollection)
{
    List<int> tempResult = new List<int>();

    foreach (var value in masterCollection)
    {
if (value > 100)
    tempResult.Add(value);
    }
    return tempResult;
}

این کالکشن موقتی بدون شک سربار حافظه دارد. جالب است بدانید که هیچ نیازی به تعریف آنها نیست. می توانید داده های درون کالکشن را با استفاده از کلید واژه ی yield برگردانید. با استفاده از این روش دیگر نیازی به آن کالکشن موقتی نیست و هنگامی که کالکشن را enumerate می کنید، داده ها را بر می گردانید. به کد زیر دقت کنید:

public IEnumerable<int> GetValuesGreaterThan100(List<int> masterCollection)
{
    foreach (var value in masterCollection)
    {
if (value > 100)
    yield return value;
    }
}

البته می توانید از LINQ هم استفاده کنید.

از Obsolete در متدهای خود استفاده کنید.

به عنوان چهارمین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که از Obsolete در متدهای خود استفاده کنید.

هنگامی که قصد توسعه ی برنامه ای را دارید که در آن متدی به زودی منسوخ می شود، می توان آن متد را با Obsolete تزیین (Decorate) کنید. به کد زیر دقت کنید:

        [Obsolete("This method will be deprecated soon. You could use XYZ alternatively.")]
        public void MyComponentLegacyMethod()
        {
            //Here is the implementation
        }

این موضوع باعث می شود که کلاینت ها در هنگام استفاده از این متد با یک Warning روبرو شوند، اگر قصد هنگام Build کردن برنامه توسط کاربر، خطایی تولید شود از پارامتر Boolean این Attribute استفاده کنید:

[Obsolete("This method is deprecated. You could use XYZ alternatively.", true)]
public void MyComponentLegacyMethod()
{
    //Here is the implementation
}

خاصیت Deferred Execution از LINQ را فراموش نکنید.

به عنوان پنجمین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که خاصیت Deferred Execution از LINQ را فراموش نکنید.

این خاصیت به این معناست که دستورات LINQ در هنگام تعریف آنها اجرا نمی شوند. اجرای این دستوارت فقط وقتی اتفاق می افتد که آیتمی از کالکشن نتیجه را مورد دسترسی قرار دهید. در آموزش 5 Entity Framework در سی شارپ و آموزش LINQ در سی شارپ در این رابطه صحبت کرده ایم. ضمناً، می توانید از آموزش کلاس های کالکشنی در سی شارپ نیز در این رابطه استفاده کنید.

به علاوه، دقت کنید که با هر بار دسترسی شما به کالکشن نتیجه، دستورارت LINQ دوباره و سه باره اجرا می شوند. برای جلوگیری از این موضوع که خود سرباری را هم بوجود می آورد از دستور زیر استفاده کنید:

        public void MyComponentLegacyMethod(List&amp;lt;int&amp;gt; masterCollection)
        {
            //Without the ToList this linq query will be executed twice because of the following usage
            var result = masterCollection.Where(i =&amp;gt; i &amp;gt; 100).ToList();

            Console.WriteLine(result.Count());
            Console.WriteLine(result.Average());
        }

دستور بالا نتیجه ی دستور LINQ را به ToList() تبدیل کرده است. این موضوع باعث می شود که دستور LINQ مورد نظر سریعاً اجرا شود.

از تبدیل های صریح (Explicit Cast) بین اشیا استفاده کنید.

به عنوان ششمین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که از تبدیل های صریح (Explicit Cast) بین اشیا استفاده کنید.

هنگامی که یک کلاس Entity خارجی و یک کلاس Entity داخلی در پروژه دارید و به هر دلیلی قصد تبدیل اشیایی از این کلاس ها به هم را دارید، حتما از Explicit Cast استفاده کنید. به عبارت دیگر نام کلاس هدف را درون () قرار دهید. به کد زیر دقت کنید:

class Program
    {
        static void Main(string[] args)
        {
            ExternalEntity entity = new ExternalEntity()
            {
                Id = 1001,
                FirstName = "Dave",
                LastName = "Johnson"
            };
            MyEntity convertedEntity = (MyEntity)entity;
        }
    }

    class MyEntity
    {
        public int Id { get; set; }
        public string FullName { get; set; }

        public static explicit operator MyEntity(ExternalEntity externalEntity)
        {
            return new MyEntity()
            {
                Id = externalEntity.Id,
                FullName = externalEntity.FirstName + " " + externalEntity.LastName
            };
        }
    }

    class ExternalEntity
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

به Stack Trace برنامه در هنگام رخ دادن استثنا ها و یا Throw کردن آنها دقت کنید.

به عنوان هفتمین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که به Stack Trace برنامه در هنگام رخ دادن استثنا ها و یا Throw کردن آنها دقت کنید. برای کسب اطلاعات بیشتر در رابطه با Debugging می توانید از آموزش دیباگ کردن Debugging در سی شارپ از وبسایت پرووید استفاده کنید.

به کد زیر دقت کنید:

        public void RunDataOperation()
        {
            try
            {
                Intialize();
                ConnectDatabase();
                Execute();
            }
            catch (Exception exception)
            {
                throw exception;
            }
        }

در کد بالا، اگر استثنایی در متد ConnectDatabase() رخ دهد، Stack Trace برنامه فقط نشان می دهد که متد RunDataOperation() باعث ایجاد این استثنا شده است و در واقع عملیات Trace برنامه را دچار مشکل می کند. برای رفع کردن این مشکل، به صورت زیر استثنا را Throw کنید.

        public void RunDataOperation()
        {
            try
            {
                Intialize();
                ConnectDatabase();
                Execute();
            }
            catch (Exception)
            {
                throw;
            }
        }

در Enumeration های خود از Flags استفاده کنید.

به عنوان هشتمین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که در Enumeration های خود از Flags استفاده کنید. این موضوع باعث می شود که بتوانید به صورت بیتی به عناصر Enumeration دسترسی داشته باشید. در رابطه با Enumeration ها در آموزش شی گرایی OOP در سی شارپ از وبسایت پرووید بیشتر صحبت کرده ایم. به کد زیر دقت کنید:

    class Program
    {
        static void Main(string[] args)
        {
            int snakes = 14;
            Console.WriteLine((Reptile)snakes);
        }
    }

    [Flags]
    enum Reptile
    {
        BlackMamba = 2,
        CottonMouth = 4,
        Wiper = 8,
        Crocodile = 16,
        Aligator = 32
    }

با تزیین کردن Enumeration تعریف شده با Flags خروجی دستور متد Main به صورت BlackMamba, CottonMouth, Wiper خواهد بود. بدون استفاده از Flags خروجی به صورت 14 خواهد بود چرا که متغیر snakes خط قبل یک int است.

نوع Type Parameter کلاس های جنریک خود را کنترل کنید.

به عنوان نهمین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که نوع Type Parameter کلاس های جنریک خود را کنترل کنید.

فرض کنید یک کلاس یا کالکشن جنریک تعریف کرده اید و قصد دارید کاربر کلاس را ملزم کند که Type Parameter کلاس را کلاسی تنظیم کند که یک خاصیت خاص داشته باشد. در رابطه با Collection ها در آموزش کلاس های کالکشنی در سی شارپ بیشتر صحبت کرده ایم. مثلاً یک اینترفیس خاص را پیاده سازی کند و یا از یک کلاس خاص ارث بری کند. می توانید این کار را به صورت زیر انجام دهید:

    class MyGenricClass<T> where T : IMyInterface
    {
        //Body of the class come in here
    }

علاوه بر کلاس، این کار را می توانید برای یک متد انجام دهید:

    class MyGenricClass
    {
        public void MyGenericMethod<T>(T t) where T : IMyInterface
        {
            //Generic implementation goes in here
        }
    }

ضمناً در آموزش اینترفیس ها در سی شارپ در رابطه با اینترفیس ها در سی شارپ بیشتر صحبت کرده ایم.

کالکشن های کلاس خود را نسبت به بیرون از کلاس پدیدار نکنید.

به عنوان دهمین و آخرین نکته از سری آموزش ده نکته ی کلیدی برای برنامه نویسان سی شارپ قصد داریم به شما توصیه کنیم که کالکشن های کلاس خود را نسبت به بیرون از کلاس پدیدار نکنید.

فرض کنید کلاسی را تعریف کرده اید که یک کالکشن را درون خود دارد. در رابطه با Collection ها در آموزش کلاس های کالکشنی در سی شارپ بیشتر صحبت کرده ایم. این کالکشن از نوع IEnumerable است. در آموزش اینترفیس ها در سی شارپ در رابطه با اینترفیس ها در سی شارپ بیشتر صحبت کرده ایم. دقت کنید که صرف اینکه کالکشن از نوع IEnumerable است، دسترسی به آن را محدود نمی کند. به عبارت دیگر، کاربران کلاس شما می توانند به این کالکشن دسترسی پیدا کنند، آن را تغییر دهند و آیتمی را حذف و یا اضافه کنند. به کد زیر دقت کنید:

    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = new MyClass();
            ((List<string>)myClass.ReadOnlyNameCollection).Add("######From Client#####");

            myClass.Print();
        }
    }

    class MyClass
    {
        List<string> _nameCollection = new List<string>();
        public MyClass()
        {
            _nameCollection.Add("Rob");
            _nameCollection.Add("John");
            _nameCollection.Add("Jummy");
            _nameCollection.Add("Derek");
        }
        public IEnumerable<string> ReadOnlyNameCollection
        {
            get { return _nameCollection.AsEnumerable(); }
        }

        public void Print()
        {
            foreach (var item in ReadOnlyNameCollection)
            {
                Console.WriteLine(item);
            }
        }
    }

در کد بالا، کد مربوطه یک آیتم جدید به کالکشن کلاس اضافه می کند. برای جلوگیری از این موضوع از کد زیر استفاده کنید:

        public IEnumerable<string> ReadOnlyNameCollection
        {
            get { return _nameCollection.AsReadOnly(); }
        }

همانطور که می بینید، کد بالا از متد AsReadOnly() استفاده کرده است. این متد کالکشن مورد نظر را به صورت فقط خواندنی قابل دسترس می کند.

Similar Posts

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.