PDA

View Full Version : آموزش: اعمالRefactoring درVS.NET 2005 و VS.NET 2008به صورت کامل



ali.aghdam
سه شنبه 29 دی 1388, 15:11 عصر
Refactoring به معنای تغییر و نقل و انتقالات در کد با حفظ رفتار اصلی آن است،به بیانی دیگر تغییر در ساختار درونی یک نرم افزار جهت درک بهتر و تغییرات ساده تر آن،بدون تغییر در رفتار قابل مشاهده برنامه.
پروسه Refactoring شامل حذف کد های تکراری ، ساده سازی منطق مشکل برنامه و شفاف سازی قسمت های مختلف برنامه است.
جهت Refactoringمطمئن برنامه،باید آزمایشات دستی و یا خودکار جهت اطمینان حاصل شدن از صحت کارکرد نهایی برنامه صورت گیرد.

همواره بهتر است کار Refactoring به صورت مداوم صورت گیرد تا اینکه در طی فازهای مختلف پروژه انجام گردد.

انگیزه های موجود جهت انجام Refactoring:
1)ساده تر شدن افزودن کدهای جدید به برنامه (توسعه سیستم)
2)بهبود طراحی کدهای موجود
3)طراحی واضح تر کد های موجود
4)بالا بردن قابلیت نگهداری
5)بهبود طراحی شیء گراو...
در بسیاری از حالات،اعمالRefactoringبسیار ساده هستند.برای مثال تبدیل اعداد به سمبل های معادل.برای مثال کد زیر را در نظر بگیرید:



class SimpleMath
{
public static double CalcCircumference(double diameter)
{ return 3.14 * diameter; }
}


پس از Refactoringو تبدیل اعداد به معادل های سمبلیک داریم:




class SimpleMath
{
Public const double PI = 3.14;
public static double CalcCircumference(double diameter)
{ return PI * diameter; }
}



دیدیم که بعد از اعمال Refactoringبهبودی های زیر را در برنا مه بوجود آورد:
1)خوانایی کد افزایش یافت
2)اگر نیاز به تغییر این مقدار عددی باشد تنها یک بار مقدار این ثابت تغییر نماید و نه اینکه در تمامی قسمت های برنامه که از این عدد استفاده می کنند،تغییرات را اعمال نماییم.
خوشبختانه در اکثر IDE های خوب همانند VS.NET 2005 و بالاتر از ابزارهای Refactoring جزئی از محیط توسعه هستند.



http://p30bazan.persiangig.com/image/Refactoring/1.jpg



روش های Refactoringپشتیبانی شده در VS.NET 2005 و VS.NE 2008


Extract Method : بر اساس انتخاب قسمتی از کد امکان ایجاد متد جدیدی از آن وجود خواهد داشت.
Encapsulate Field : یک فیلد پابلیک را به فیلدی خصوصی کپسوله شده در یک خاصیت (property) دات نت تبدیل می کند.
Extract Interface : بر اساس نوع های موجود،اینترفیس جدیدی را تعریف می کند.
Reorder Parameters : روشی را جهت تغییر آرگومان ها،ارائه می دهد.
:Remove Parameters پارامتری را از لیست پارامتر های موجود حذف می کند.
Rename : امکان تغییر نام یک متد،متغیرو غیره را در سرار پروژه میسر می سازد.
استخراج متد
می توان با انتخاب قسمتی از یک کد طولانی، با استفاده از ابزارهای Refactoring محیط مجتمع توسعه،آن را تبدیل به متدی جدید نمود.
به کد زیر دقت کنید:



private void button2_Click(object sender, EventArgs e)
{
string strMess;
strMess = this.button1.Text;
MessageBox.Show(this.button1.Text);
}


اقدام به استخراج متد می کنیم.به صورت زیر:


http://p30bazan.persiangig.com/image/Refactoring/2.jpg


و سپس وارد کردن نام متد:


http://p30bazan.persiangig.com/image/Refactoring/3.jpg


بعد از اعمال Refactoringکد منتخب شما به یک متد به صورت زیرمی شود:



private void button2_Click(object sender, EventArgs e)
{
MessageButtonShow();
}

private void MessageButtonShow()
{
string strMess;
strMess = this.button1.Text;
MessageBox.Show(strMess);
}


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




public struct MyPoint
{
public int x;
public int y;


public void SetLocation()
{
Console.Write("Enter X position : ");
x = int.Parse(Console.ReadLine());
Console.Write("Enter Y position : ");
y = int.Parse(Console.ReadLine());
}
public void PrintLocation()
{
Console.WriteLine("[(0),(1)]", x, y);
}
}



جهت تبدیل فیلد های پابلیک ان به فیلد های خصوصی باید عملیات Refactoring به صورت زیر انجام گردد:
1)تعریف مجدد مقادیر x و y به صورت خصوصی
2)ایجاد خواص read/write برای هر یک از داده ها
3)پیاده سازی خواص set و get به صورت کامل


http://p30bazan.persiangig.com/image/Refactoring/4.jpg



مطابق شکل فوق فیلد x را انتخاب کرده و سپس با کلیک راست و انتخاب گزینه Encapsulate Field ،3 عملیات Refactoring بالا را براحتی انجام داد.پس از انتخاب گزینه مربوطه ، صفحه زیر نمایش داده می شود.



http://p30bazan.persiangig.com/image/Refactoring/5.jpg



نام آن Y تنظیم شده و تمامی ارجاعات به آن نیز به روز آورده خواهند شد.همچنین تمامی تغییرات انجام شده نیز در پنجره ای دیگر که به شکل زیر است نمایش داده خواهد شد.


http://p30bazan.persiangig.com/image/Refactoring/6.jpg


نتیجه تغییرات انجام شده به صورت زیر خواهد بود:



public struct MyPoint

{

public int x;

private int y;

public int Y

{

get { return y; }

set { y = value; }

}

public void SetLocation()

{

Console.Write("Enter X position : ");

x = int.Parse(Console.ReadLine());

Console.Write("Enter Y position : ");

Y = int.Parse(Console.ReadLine());

}

public void PrintLocation()

{

Console.WriteLine("[(0),(1)]", x, Y);

}

}

استخراج اینترفیس ها

کار اینترفیس تعریف مجموعه ای از اعضای ابسترکت(خواص،متدهاورخداده )است که یک نوع خاص آنها پشتیبانی خواهد کرد.زیبایی اینترفیس ها زمانی مشخص می گردد که نوع هایی در سلسله مراتب مختلف،یک انترفیس مشابهی را پیاده سازی می کنند.همچنین اینترفیس ها امکان پلی مرفیسم را در سطح فضاهای نام،اسمبلی ها و غیره فراهم سازد.
با استفاده از قابلیت Extract Interface Refactoring می توان مجموعه ای از اعضای یک کلاس را انتخاب و از آنها اینترفیس جدیدی را استخراج نمود.
برای مثال کد زیر را در نظر بگیرید:



//Assume you have referenced System.Drawing.dll

//and update your 'using' directoryes

//to make use of Rectangle and Color types.

class TwoDShap

{

public void Draw()

{/* Some Interesting code.*/}

public Rectangle GetBoundingRect()

{/* More Interesting code.*/}

public Color GetArgb()

{/* Even Interesting code.*/}
}



فرض کنید کلاس های دیگری در برنامه به نام های ThreeDShapeو Printer نیز به سه متد فوق نیاز دارند.اگر این سه متد در یک اینترفیس سفارشی قرار گیرند(برای مثال به نام IRender )می توان به پلی مرفیسم بر مبنای اینترفیس ها دست یافت.
با انتخاب سه متد و سپس اعمال Extract Interface Refactoring از طریق منوی مربوطه،شکل ذیر ظاهر خواهد شد.



http://p30bazan.persiangig.com/image/Refactoring/7.jpg



نکته:همچنین می توان به جای انتخاب متد های مورد نظر می توان نام کلاس را نیز انتخاب کرده و سپس منوی از Refactoring کار مورد نظر را انجام داد، از این مورد می توان جهت انتخاب متد های قرار گرفته در نقاط مختلف یک فایل بسیار مفید است.
پس از کلیک بر روی دکمه OK ،ابتدا فایل (کلاس) با نام IRender به صورت زیر ایجاد می گردد:



using System;
namespace WindowsApplication3
{
interface IRender
{
void Draw();
System.Drawing.Color GetArgb();
System.Drawing.Rectangle GetBoundingRect();
}
}


همچنین کد قبلی،به صورت زیر در حالتی که اینترفیس ایجاد شده را پیاده سازی می کند؛یغییر خواهد نمود:



class TwoDShap : RefractoringExample.IRender

تغییر ترتیب آرگومانها

مثال زیر را در نطر بگیرید:



//Assume you have referenced System.Drawing.dll

//and update your 'using' directoryes

//to make use of Rectangle

class ImageRenderer

{

public void Render(Point TopLeft,Point bottomRight,Graphics g)

{/* Interesting code.*/}

public void Render(Graphics g,int x,int y)

{/* Interesting code.*/}

public void Render(Graphics g,Rectangle boundingBox)

{/* Interesting code.*/}
}



از منوی Refactoringگزینه Reorder Parameters را انتخاب می کنیم:


http://p30bazan.persiangig.com/image/Refactoring/8.jpg


نحوه overloading توابع در این کلاس،باتوجه به محل قرارگیری آرگومان های آنها بسیار ناخوشایند است. می توان ترتیب آرگومان ها به سادگی را تغییرداد.به صورت زیر:


http://p30bazan.persiangig.com/image/Refactoring/9.jpg


بعد از تغییر ترتیب متغییر ها کد زیر حاصل می شود:



class ImageRenderer

{

public void Render(Graphics g, Point TopLeft, Point bottomRight)

{/* Interesting code.*/}

public void Render(Graphics g,int x,int y)

{/* Interesting code.*/}

public void Render(Graphics g,Rectangle boundingBox)

{/* Interesting code.*/}

}


حذف پارامتر ها

این گزینه بسیار واضح است.برای مثال فرض کنید که از تابع Render (تابع در مثال قبل)می خواهیم پارامتر دوم را حذف نماییم.



http://p30bazan.persiangig.com/image/Refactoring/10.jpg



در ادامه لیستی از تغییراتی که در برنامه در اثر این تغییر اعمال خواهد شد نیز نمایش داده می شود.



http://p30bazan.persiangig.com/image/Refactoring/11.jpg



بعد حذف پارامتر bottomRight تابع قبلی به پارامتر زیر تبدیل می شود:





class ImageRenderer

{

public void Render(Graphics g, Point TopLeft)

{/* Interesting code.*/}

public void Render(Graphics g,int x,int y)

{/* Interesting code.*/}

public void Render(Graphics g,Rectangle boundingBox)

{/* Interesting code.*/}


}


تغییر نام یک متد ، فضای نام ، پارامترهاوغیره

گزینه تغییر نام نیز بسیار واضح است.گاهی از اوقات جهت بالا بردن خوانایی برنامه نیاز می شود تا نامی در برنامه تغییر یابد.به وسیله ابزار Refactoring این کار به صورت خودکار،کاملا دقیق و بدون خطا در تمامی برنامه اعمال خواهد گردید.



http://p30bazan.persiangig.com/image/Refactoring/12.jpg



تبدیل متغیر به پارامتر های تابع

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






private void button1_Click(object sender, EventArgs e)
{
MessgageText();
}

public static void MessgageText()
{
string mesText = "Hello World.";
MessageBox.Show(mesText );
}



اکنون بهتر است mesText تبدیل به آرگومان ورودی این تابع گردد.برای این منظور مطابق شکل زیر عمل کرد.


http://p30bazan.persiangig.com/image/Refactoring/13.jpg



در این حالت خروجی کار به صورت زیر خواهد بود:





private void button1_Click(object sender, EventArgs e)

{

MessgageText("Hello World.");

}

public static void MessgageText(string mesText)

{

MessageBox.Show(mesText);

}






امید است که این آموزش ها بتواند اندکی آگاهی ها و مهارت ها را در شما دانش پژوهان گرامی،افزایش داده باشد.
منابع :
کتاب آقای نصیری و اون ور این ور ...:گیج:

ali.aghdam
چهارشنبه 30 دی 1388, 13:41 عصر
برای اطلاعات و مثال های بیشتر می توانید از کتاب های زیر استفاده کنید:




http://bks7.books.google.com/books?id=1MsETFPD3I0C&printsec=frontcover&img=1&zoom=5&edge=curl&sig=ACfU3U10OV0tB5DT2JhveIPKUOl0DV_eaA (http://books.google.com/books?id=1MsETFPD3I0C&lpg=PP1&pg=PP1#v=onepage&q=&f=false)


improving the design of existing code (http://books.google.com/books?id=1MsETFPD3I0C&lpg=PP1&pg=PP1#v=onepage&q=&f=false)
By Martin Fowler, Kent Beck (http://books.google.com/books?id=1MsETFPD3I0C&lpg=PP1&pg=PP1#v=onepage&q=&f=false)


and

(http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)

http://www.ebookchm.com/screen/it-ebooks/51szmehjyelaa240xq3.jpg (http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)
(http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)

Refactoring Databases Evolutionary Database Design (http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)
(http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)
(http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)



by Addison Wesley Ebook (http://www.ebookchm.com/ebooks_refactoring-databases-evolutionary-database-design_1322.html)

rezatati
یک شنبه 18 بهمن 1388, 17:17 عصر
فکر کنم تصاویر مقاله رو آپلود نکردین اگه این کارو بکنین خیلی بهتر می شه (یا شاید رو سیستم من نشون نمیده )
با تشکر از زحمات تمامی دوستان

ali.aghdam
یک شنبه 18 بهمن 1388, 17:25 عصر
فکر کنم تصاویر مقاله رو آپلود نکردین اگه این کارو بکنین خیلی بهتر می شه (یا شاید رو سیستم من نشون نمیده )
با تشکر از زحمات تمامی دوستان

نه فکر کنم مشکل از مرورگر شما باشد

شما اگر با تصویر ها مشکل دارید می تونید انها را به صورت مستقیم از آدرس زیر مشاهده کنید


http://p30bazan.persiangig.com/image/Refactoring (http://p30bazan.persiangig.com/image/Refactoring/)


دوستان در آینده ای نزدیک مطالب قبلی با مطالب بسیار جدید در مورد اعمالRefactoring در VS 2010 را به صورت PDF قرار خواهم داد
با امید پیروزی و موفقیت برای همه عزیزان.

ali.aghdam
شنبه 16 مرداد 1389, 00:50 صبح
میخام یه کتاب معرفی کنم که به درد حرفه ای ها می خوره تا حرفه ای تر بشن!


Refactoring with Microsoft Visual Studio 2010


http://4.bp.blogspot.com/_4GSTeWyiRnY/TFsrm_tLm6I/AAAAAAAAAEg/rcgWKyy_dGk/s320/pp_vs2010_cover2.jpg (http://4.bp.blogspot.com/_4GSTeWyiRnY/TFsrm_tLm6I/AAAAAAAAAEg/rcgWKyy_dGk/s1600/pp_vs2010_cover2.jpg)بله درست متوجه شدید Refactoring که هر برنامه نویس حرفه ای باید ازش پیروی کنه (اگر از Refactoring درکی ندارید به این + (http://aliaghdam.blogspot.com/2010/05/refactoring.html) پست مراجعه کنید).


این کتاب توسط Peter Richie نوشته شده که به حق میشه از ایشون به عنوان یک برنامه نویس و طراح زبان حرفه ای نام برد و توسط انتشارات Packt (http://www.packtpub.com/) به چاپ رسیده است.

فهرست مطالب به شرح زیر است :

Chapter 1: Introduction to Refactoring

Chapter 2: Improving Code Readability

Chapter 3: Improving Code Maintainability

Chapter 4: Improving Code Navigation

Chapter 5: Improving Design Correctness

Chapter 6: Improving Class Quality

Chapter 7: Refactoring to Loosely Coupled

Chapter 8: Refactoring to Layers

Chapter 9: Improving Architectural Behavior

Chapter 10: Improving Architectural Structure

Chapter 11: Ensuring Quality with Unit Testing


شما برای خرید کتاب می توانید از این + (https://www.packtpub.com/refactoring-with-microsoft-visual-studio-2010/book?utm_source=arkcore.wordpress.com&utm_medium=bookrev&utm_content=blog&utm_campaign=mdb_004133) لینک استفاده کنید.
برای آشنای با کتاب می تونید از قسمتی از کتاب که به صورت رایگان است استفاده کنید .

Chapter No 6: Improving Class Quality (https://www.packtpub.com/sites/default/files/0103-chapter-6-improving-class-quality.pdf)