<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>مدونة النبهاني &#187; oop</title>
	<atom:link href="http://alnabhani.wordpress.com/tag/oop/feed/" rel="self" type="application/rss+xml" />
	<link>http://alnabhani.wordpress.com</link>
	<description>أحدث مواضيعي البرمجية والتقنية</description>
	<lastBuildDate>Sat, 28 Nov 2009 17:05:07 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>ar</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='alnabhani.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/91abf77f7c013d66c6f253d8802f990d?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>مدونة النبهاني &#187; oop</title>
		<link>http://alnabhani.wordpress.com</link>
	</image>
			<item>
		<title>إدارة مجموعات الكائنات Managing Objects Groups</title>
		<link>http://alnabhani.wordpress.com/2008/08/24/manage_collections_of_objects/</link>
		<comments>http://alnabhani.wordpress.com/2008/08/24/manage_collections_of_objects/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 19:24:17 +0000</pubDate>
		<dc:creator>alnabhani</dc:creator>
				<category><![CDATA[تقنية عامة]]></category>
		<category><![CDATA[collections]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[vb.net]]></category>

		<guid isPermaLink="false">http://alnabhani.wordpress.com/2008/08/24/manage_collections_of_objects/</guid>
		<description><![CDATA[لا يخفى على أي مبرمج اهميه مجموعات الكائنات عندما ترغب بالتعامل مع مجموعة كائنات من النوع ذاته فلا داعي لإنشاء 20 نسخه من ذات الكائن بل الحل بعمل Group والتي قد تكون مصفوفة Array في اغلب الاحوال .
كل من يدرس لغة برمجة او يستخدمها – مهما كان مبتدئا ومعلوماته ضئيلة – اعتقد انه يجب ان [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alnabhani.wordpress.com&blog=454111&post=83&subd=alnabhani&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>لا يخفى على أي مبرمج اهميه مجموعات الكائنات عندما ترغب بالتعامل مع مجموعة كائنات من النوع ذاته فلا داعي لإنشاء 20 نسخه من ذات الكائن بل الحل بعمل Group والتي قد تكون مصفوفة Array في اغلب الاحوال .</p>
<p>كل من يدرس لغة برمجة او يستخدمها – مهما كان مبتدئا ومعلوماته ضئيلة – اعتقد انه يجب ان يكون ملما بالمصفوفات Arrays والتعامل معها ، ما يدور في هذه المقاله هو شيء مشابه لموضوع المصفوفات ولكن من الزاوية الاعلى ! ( كلام غريب أليس كذلك ! )</p>
<p>يوجد طريقتان رئيستان في VB.NET ( وكذلك #C على حد علمي ) لعمل مجموعة من الكائنات ، الأولى هي عمل مصفوفة Array والطريقة الثانية ( الاكثر مرونة ) هي عمل Collection للكائنات .</p>
<h3>الطريقة الأولى : المصفوفات Arrays :</h3>
<p>تعتبر هذه الطريقة طريقة شائعه في كل لغات البرمجة تقريبا ، وهي طريقة ستاتيكية أي ثابته تقريبا ، حيث عند التصريح عن مصفوفة من كائن معين فإن عدد الكائنات يكون محددا ، وقد تحتوي المصفوفة على كائنات خالية كما انه يمكنك التعاملمع كائناتها بشكل متسلسل Sequential ، وفي هذه الحالات يفضل عمل مصفوفات من الكائنات .</p>
<h3>الطريقة الثانية : المجموعات Collections :</h3>
<p>تمتاز هذه الطريقة بعدم الحاجة لأن يكون لديك عدد ثابت ومحدد من الكائنات ، وفي المقابل فأي Collection هي عبارة عن فئة Class لذلك فيجب علينا ان ننشيء كائنا جديدا من احد انواع الـ Collections حتى تستطيع اضافة العناصر والتعامل معها من خلالها .</p>
<p>أحد الميزات الرئيسية في استخدام الـ collections هو امكانيه اضافة وحذف أي عنصر من الـ Collection في وقت التنفيذ وهي بذلك تقدم مرونة كبيرة جدا نفتقدها في المصفوفات Arrays . الميزة في الـ Collections انه يمكن اعطاء كل عنصر Element في ال Collection مفتاح key معين يرمز إليه ويسهل الوصول اليه مباشرة بعيدا عن حفظ رقم الفهرس index الخاص به كما هو الحال مع المصفوفات Arrays .</p>
<p>الفئات الخاصة بالـ Collections توجد داخل فضاء الأسماء System.Collections ويمكن ان تحتوي كل collection منها على عناصر من انواع مختلفة ، واذا اردت ضمان ان يكون جميع العناصر من نواع واحد معين نحدده فالأفضل استخدام انواع الـ Collections الموجودة في فضاء الأسماء System.collections.Generics والتي ظهرت منذ الاصدار 2005 .</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/alnabhani.wordpress.com/83/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/alnabhani.wordpress.com/83/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alnabhani.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alnabhani.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alnabhani.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alnabhani.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alnabhani.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alnabhani.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alnabhani.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alnabhani.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alnabhani.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alnabhani.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alnabhani.wordpress.com&blog=454111&post=83&subd=alnabhani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://alnabhani.wordpress.com/2008/08/24/manage_collections_of_objects/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">alnabhani</media:title>
		</media:content>
	</item>
		<item>
		<title>العناصر المشتركة shared Members في visual basic .net :</title>
		<link>http://alnabhani.wordpress.com/2008/08/18/%d8%a7%d9%84%d8%b9%d9%86%d8%a7%d8%b5%d8%b1-%d8%a7%d9%84%d9%85%d8%b4%d8%aa%d8%b1%d9%83%d8%a9-shared-members-%d9%81%d9%8a-visual-basic-net/</link>
		<comments>http://alnabhani.wordpress.com/2008/08/18/%d8%a7%d9%84%d8%b9%d9%86%d8%a7%d8%b5%d8%b1-%d8%a7%d9%84%d9%85%d8%b4%d8%aa%d8%b1%d9%83%d8%a9-shared-members-%d9%81%d9%8a-visual-basic-net/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 18:58:00 +0000</pubDate>
		<dc:creator>alnabhani</dc:creator>
				<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[bet]]></category>
		<category><![CDATA[keyword]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[shared members]]></category>
		<category><![CDATA[vb]]></category>

		<guid isPermaLink="false">http://alnabhani.wordpress.com/2008/08/18/%d8%a7%d9%84%d8%b9%d9%86%d8%a7%d8%b5%d8%b1-%d8%a7%d9%84%d9%85%d8%b4%d8%aa%d8%b1%d9%83%d8%a9-shared-members-%d9%81%d9%8a-visual-basic-net/</guid>
		<description><![CDATA[العنصر الذي يصرح عنه بانه مشترك Shared في Visual Basic .Net ( او static في لغات الـ C ) يعتبر عنصرا مشتركا لكل الفئات التي تنشأ من نفس الفئة . كلام مكرر وغير مفهوم وكل الكتاب يكتبونه نفسه عند شرحهم وتناولهم لهذا الموضوع وتعت منه كثيرا وأعتقد انك انت عزيزي القارئ بدأت تكره كلمة Shared [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alnabhani.wordpress.com&blog=454111&post=66&subd=alnabhani&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>العنصر الذي يصرح عنه بانه مشترك Shared في Visual Basic .Net ( او static في لغات الـ C ) يعتبر عنصرا مشتركا لكل الفئات التي تنشأ من نفس الفئة . كلام مكرر وغير مفهوم وكل الكتاب يكتبونه نفسه عند شرحهم وتناولهم لهذا الموضوع وتعت منه كثيرا وأعتقد انك انت عزيزي القارئ بدأت تكره كلمة Shared عندما تراها في أي كود لنفس السبب !! اليس هذا ما تريد قوله ؟ طيب لندخل معا على الموضوع من زاوية اخرى&#160; : </p>
<p> <span id="more-66"></span>
<p>افترض أن لدينا فئة إسمها Person تحتوي على الحقل Field المسمى ParentClassName ، ويوجد لدينا ثلاث كائنات منشأه من هذه الفئة الاول اسمه Ahmed والثاني Mohammed فإن قيمة الحقل ParentClassName يختلف في Ahmed عنه عند Mohammed ، لكن لو تم تعريف الحقل ParentClassName على انه Shared فسيكون هو نفسه دوما ، فتغيير قيمته عند Ahmed سيغير قيمته عن Mohammed مباشرة ! </p>
<p>هذا بالنسبه للحقول والخصائص Properties ، لكن ماذا عن الطرق Methods والتي تشمل الإجراءات Subs والدوال Functions ؟ </p>
<p>في هذه الحالة فإن الطريقة المعرفة على انها shared يمكن الوصول إليها مباشرة دون الحاجة الى انشاء كائن جديد من الفئه اولا&#160; ثم استدعاء الطريقة منه ، مثلا ، الطريقة SetEnvironmentVariable التابعة للفئه System.Environment هي طريقة مشتركه ، فلاستخدامها لسنا بحاجه لأن نقوم بغنشاء كائن جديد من الفئة Environment ثم استدعاء تلك الطريقة ولكن كتابة اسم الفئة الأساسية مباشرة SetEnvironmentVariable&#160; System.Environment. . </p>
<p>بالنسبة للفئة system.Environment فهي من اكثر الفئات التي تستخدم الاعضاء المشتركة Shared Members التي واجهتها في لغات الدوت نت ، هناك العديد من الفئات الاخرى التي تنتهج نفس النهج ، وعادة ما تكون هذه الفئات مصممه لتعطينا معلومات للقراءه فقط او معلومات عامة لا تتغير مهما ، وفي الحقيقة هل تتوقع ان تجد اكثر من MachineName لنفس الجهاز ؟ طبعا لا </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/alnabhani.wordpress.com/66/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/alnabhani.wordpress.com/66/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alnabhani.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alnabhani.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alnabhani.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alnabhani.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alnabhani.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alnabhani.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alnabhani.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alnabhani.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alnabhani.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alnabhani.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alnabhani.wordpress.com&blog=454111&post=66&subd=alnabhani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://alnabhani.wordpress.com/2008/08/18/%d8%a7%d9%84%d8%b9%d9%86%d8%a7%d8%b5%d8%b1-%d8%a7%d9%84%d9%85%d8%b4%d8%aa%d8%b1%d9%83%d8%a9-shared-members-%d9%81%d9%8a-visual-basic-net/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">alnabhani</media:title>
		</media:content>
	</item>
		<item>
		<title>التعامل مع الاخطاء في البرمجة الكائنية : الفئة ExecutionCondition مثالاً</title>
		<link>http://alnabhani.wordpress.com/2008/07/22/executioncondition/</link>
		<comments>http://alnabhani.wordpress.com/2008/07/22/executioncondition/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 03:37:56 +0000</pubDate>
		<dc:creator>alnabhani</dc:creator>
				<category><![CDATA[Visual Basic .Net]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[errors]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[execution condition]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[الاستثناءات]]></category>

		<guid isPermaLink="false">http://alnabhani.wordpress.com/?p=37</guid>
		<description><![CDATA[يعد اسلوب البرمجة الكانئية افضل اسلوب برمجي تطبقه في معظم اللغات الحديثة والقوية وخصوصا لغات الدوت نت سواء كانت VB.Net او C# ، وعندما تطبق هذا الاسلوب فمن الاكيد بانك ستقوم ببناء فئات Classes وستحتوي بداخلها على اعضاء Members كـ Properties,Function,Subs وغيرها ، ثم تستخدم هذه الفئات في أي جزء رئيسي من الرنامج بإنشاء كائن [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alnabhani.wordpress.com&blog=454111&post=37&subd=alnabhani&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p dir="rtl">يعد اسلوب البرمجة الكانئية افضل اسلوب برمجي تطبقه في معظم اللغات الحديثة والقوية وخصوصا لغات الدوت نت سواء كانت VB.Net او C# ، وعندما تطبق هذا الاسلوب فمن الاكيد بانك ستقوم ببناء فئات Classes وستحتوي بداخلها على اعضاء Members كـ Properties,Function,Subs وغيرها ، ثم تستخدم هذه الفئات في أي جزء رئيسي من الرنامج بإنشاء كائن جديد منها ثم اسناد القيم والخصائص إليه من خلال المشيد Constructor في حالة وجوده او من خلال الخصائص القابلة للكتابة Writable Properties او لاشيء من هذا !</p>
<p dir="rtl">لاحقا وبعد ان تكتب الاكواد داخل الأعضاء الخاصة بفئتك التي انشاتها للتو واللحظة ، فإنك قد تتساءل حول عملية قنص الاستثناءات Exceptions ، فماذا لو حدث استثناء معين او خطاء وقت التنفيذ في الكود ؟ هذا ما سنناقشه هنا .</p>
<p dir="rtl"><span id="more-37"></span></p>
<p dir="rtl">لنفترض انك قد قمت بعمل فئة بالإسم MyData والتي تمثل بيانات شخصيه معينه يتم اسنادها لها ،كالخصائص التالية مثلا : FirstName,FamilyName,Age  ، بحيث صارت كالتالي :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">Public Class MyData</p>
<p dir="ltr">    Dim _FirstName As String</p>
<p dir="ltr">    Public Property FirstName() As String</p>
<p dir="ltr">        Get</p>
<p dir="ltr">            Return _FirstName</p>
<p dir="ltr">        End Get</p>
<p dir="ltr">        Set(ByVal value As String)</p>
<p dir="ltr">            _FirstName = value</p>
<p dir="ltr">        End Set</p>
<p dir="ltr">    End Property</p>
<p dir="ltr"> </p>
<p dir="ltr">    Dim _FamilyName As String</p>
<p dir="ltr">    Public Property FamilyName() As String</p>
<p dir="ltr">        Get</p>
<p dir="ltr">            Return _FamilyName</p>
<p dir="ltr">        End Get</p>
<p dir="ltr">        Set(ByVal value As String)</p>
<p dir="ltr">            _FamilyName = value</p>
<p dir="ltr">        End Set</p>
<p dir="ltr">    End Property</p>
<p dir="ltr"> </p>
<p dir="ltr">    Dim _Age As Byte</p>
<p dir="ltr">    Public Property Age()</p>
<p dir="ltr">        Get</p>
<p dir="ltr">            Return _Age</p>
<p dir="ltr">        End Get</p>
<p dir="ltr">        Set(ByVal value)</p>
<p dir="ltr">            _Age = value</p>
<p dir="ltr">        End Set</p>
<p dir="ltr">    End Property</p>
<p dir="ltr"> </p>
<p dir="ltr">End Class</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> ثم طلبت منك ان تضيف لهذه الفئة طريقة Method تقوم بكتابة البيانات الى ملف &#8211; وذلك بإضافتها الى بيانات اخرى موجودة سابقا- لتكتب الاسم الاول والعائلة والعمر ، ولنفترض &#8211; واقول نفترض- انك كتبت الكود التالي بالضبط ( بما فيه من اخطاء فادحة ! ) :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">    Public Sub WriteDataToFile(ByVal FileName As String)</p>
<p dir="ltr">        Dim FileContent As String</p>
<p dir="ltr">        FileContent = &#8220;الإسم الأول : &#8221; &amp; Me.FirstName &amp; &#8221; العائلة : &#8221; &amp; Me.FamilyName &amp; &#8221; العمر &#8221; &amp; Me.Age</p>
<p dir="ltr"> </p>
<p dir="ltr">        My.Computer.FileSystem.WriteAllText(FileName, FileContent, True)</p>
<p dir="ltr"> </p>
<p dir="ltr"> </p>
<p dir="rtl" align="right">    End Sub</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">الآن لو قمنا بإنشاء كائن جديد من هذه الفئة واعطيناه قيما لخصائصه وطلبنا من الكائن ان يتكرم علينا بتنفيذ الطريقة WriteDataToFile واعطيناه الوسيط المناسب كالتالي :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">Module Module1</p>
<p dir="ltr"> </p>
<p dir="ltr">    Sub Main()</p>
<p dir="ltr"> </p>
<p dir="ltr">        Dim Mohammed As New MyData</p>
<p dir="ltr">        Mohammed.FirstName = &#8220;Mohammed&#8221;</p>
<p dir="ltr">        Mohammed.FamilyName = &#8220;AL-Nabhani&#8221;</p>
<p dir="ltr">        Mohammed.Age = 20</p>
<p dir="ltr"> </p>
<p dir="ltr">        Mohammed.WriteDataToFile(&#8220;C:\Users\Personals\Documents\MyData.txt&#8221;)</p>
<p dir="ltr"> </p>
<p dir="ltr">        Console.ReadLine()</p>
<p dir="ltr"> </p>
<p dir="ltr">    End Sub</p>
<p dir="ltr"> </p>
<p dir="ltr">End Module</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">ثم قمنا بتجربة البرنامج ، لكن مهلا هناك استثناء وارد بنسبه كبيرة جدا وهو ان الملف MyData غير موجود ! قد تفكر بان عملية التحقق من وجود الملف اولا افضل وانا اتفق معك في ذلك تماما ، لكن ما هي سيناريوهات العملية القادمة ؟ اذا لم يجد الملف ماذا يفعل البرنامج ؟</p>
<p dir="rtl"> </p>
<p dir="rtl">في حالتي لا اريد انشاء ملف لانني اريد ان اضيف البيانات الى الملف MyData لا أن أققوم بإنشاءه في حالة عدم وجودة ، لذلك فإننا نرغب الآن بإعلام المستخدم بأن الملف غير موجود واجزم انك تتفق معي الان في ذلك ، لكن السؤال كيف سنخبر المستخدم بذلك ؟ ان كنت ستقول لنكتب سطرا مثل التالي في الطريقة المعنية :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">    Public Sub WriteDataToFile(ByVal FileName As String)</p>
<p dir="ltr">        Dim FileContent As String</p>
<p dir="ltr">        FileContent = &#8220;الإسم الأول : &#8221; &amp; Me.FirstName &amp; &#8221; العائلة : &#8221; &amp; Me.FamilyName &amp; &#8221; العمر &#8221; &amp; Me.Age</p>
<p dir="ltr"> </p>
<p dir="ltr">        If My.Computer.FileSystem.FileExists(FileName) = True Then</p>
<p dir="ltr">            My.Computer.FileSystem.WriteAllText(FileName, FileContent, True)</p>
<p dir="ltr">        Else</p>
<p dir="ltr">            Console.Write(&#8220;الملف غير موجود&#8221;)</p>
<p dir="ltr">        End If</p>
<p dir="ltr"> </p>
<p dir="ltr">    End Sub</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">فسأقول لك ان الطريقة السابقة خاطئة تماما ، صحيح انها ستعطينا الناتج النهائي المطلوب كما قد تشتهيه ، ولكن في في اسلوب البرمجة الكائنيه ذلك خطأ ، فالمفترض ان الفئة التي انشاناها لا تعرض شيء على الشاشة بدون اذن الطريقة Main ، وافرض او اننا اردنا استخدام هذه الفئة في مشروع من نوع WIndowsApplication بدل ConsoleApplication فماذا ستفعل ؟ الادهى لو قمت بترجمه الفئة الى ملف Dll فكيف ستعرف نوع المشروع الحالي ؟ حتى لو عرفت من خلال الكود فهل يعجبك ان تكتب جملة شرطية للتأكد من نوع المشروع ثم اظهار رسالة الخطأ بالطريقة الخاصة بكل واحد ؟</p>
<p dir="rtl"> </p>
<p dir="rtl">اتمنى انك اقتنعت بذلك ، اما الحل فسيكون بتعديل الطريقة WriteDataToFile لتكون  دالة Function بدل Sub وجعلها تعود بقيمة معينه ، طيب فكر معي ، ما هو النوع Type الخاص بهذه الدالة function والتي ستعيده ؟ هل ستعيد Boolean لنعرف ان حدث خطأ ام لا ؟ ام تعيد String في كل مرة ام أي نوع ؟ طيب لنفكر في كل واحدة على حده :</p>
<p dir="rtl"> </p>
<ul>
<li>1- النوع Boolean : فكرة جيدة ، لجعل الدالة تعيد قيمة True ان تم تنفيذها كما يجب ، و False في الحالة المعاكسه ولكن يعيبها عدم اعادتها لرسالة الخطأ ، ففي حالة امكانية حدوث اكثر من خطأ واحد فهناك ستواجه مشكلة حول أي رسالة خطأ ستعرض او أي اجراء ستنفذ .</li>
<li>2- النوع String : طريقة جيدة نوعا ما ، لكن لو اردت كتابة دالة تعيد نوع معينا مثلا تقرأ ملفا معينا وتعيد الاسم الاول فكيف ستعرف ان ما اعادته هو الاسم الاول او رسالة الخطأ ؟</li>
</ul>
<p dir="rtl">لا تقل لي لنضع Field ( حقل ) عام على مستوى المشروع بمثابته متغير من النوع Boolean يعرف اذا حدث خطا ام لا فهذه الطريقة تنتهك OOP من كل النواحي !</p>
<p dir="rtl"> </p>
<p dir="rtl">طيب ما الحل اذا ؟</p>
<p dir="rtl">الحل يتم بعمل نوع جديد خاص بنا لمثل هذه الحالات ، وهو عمل فئة Class تحمل خاصية تخبرنا ان حدث خطا او لا ، وتعطينا ايضا نص رسالة الخطأ او حتى كائن الـ Error بأكمله او أي شيء من هذا القبيل &#8230; كما قد نطورها اكثر لتحمل قيمة ما تود ارجاعه كما في الحالة الثانية اعلاه ، وهو الحل الذي سأتبعه في هذا النطاق مع انه قد يوجد حلول افضل ولكن ذلك يعتمد على الحالات التي تواجهها في برامجك .</p>
<p dir="rtl"> </p>
<p dir="rtl">الفئة الجديدة والتي سنعول عليها معرفة حدوث خطأ وحمل قيمة ناتج عملياتنا اسميتها ExecutionCondition وستحمل الخصائص التالية :</p>
<ul>
<li>HasErrors : وهي خاصية للقراءة فقط ReadOnly ومن النوع Boolean</li>
<li>ErrorMessage : وهي خاصية للقراءة فقط ايضا ومن النوع Strign</li>
<li>Value : وهي خاصية اختيارية لك ، وهي من النوع Object .</li>
</ul>
<p dir="rtl"> </p>
<p dir="rtl">بالنسبة للطرق فقد وضعت اجرائين فقط :</p>
<ul>
<li>SetErrorMessage : وهو الذي نستخدمه في اعطاء الخاصية ErrorMessage قيمتها وبناءا عليه تتحدد قمية الخاصية HasErrors .</li>
<li>Reset : يعيد الكائن الى حالته الاساسية أي بدون خطأ مع عدم المساس بقيمة الكائن المتمثل في الخاصية Value .</li>
</ul>
<p dir="rtl"> </p>
<p dir="rtl">لن اقوم بشرح كل شيء في هذه الفئة ، فهي واضحة وضوح الشمس لكل من لديه اساسيات ولو بسيطة في OOP :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">&#8221;&#8217; &lt;summary&gt;</p>
<p dir="ltr">&#8221;&#8217; This class is used to return an object with value and error message when error occur</p>
<p dir="ltr">&#8221;&#8217; &lt;/summary&gt;</p>
<p dir="ltr">&#8221;&#8217; &lt;remarks&gt;&lt;/remarks&gt;</p>
<p dir="ltr">Public Class ExecutionCondition</p>
<p dir="ltr">#Region &#8220;Properties&#8221;</p>
<p dir="ltr">    Dim _HasErrors As Boolean</p>
<p dir="ltr">    &#8221;&#8217; &lt;summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; Determines if the assosiated process has an errors while executing it</p>
<p dir="ltr">    &#8221;&#8217; &lt;/summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;value&gt;&lt;/value&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;returns&gt;&lt;/returns&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;remarks&gt;&lt;/remarks&gt;</p>
<p dir="ltr">    Public ReadOnly Property HasErrors() As Boolean</p>
<p dir="ltr">        Get</p>
<p dir="ltr">            If Me._HasErrors = True Then Me._ErrorMessage = &#8220;&#8221; </p>
<p dir="ltr">            Return _HasErrors</p>
<p dir="ltr">        End Get</p>
<p dir="ltr">    End Property</p>
<p dir="ltr"> </p>
<p dir="ltr">    Dim _ErrorMessage As String</p>
<p dir="ltr">    &#8221;&#8217; &lt;summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; Gets the error message if the assisiated process has an erors while executing</p>
<p dir="ltr">    &#8221;&#8217; &lt;/summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;value&gt;&lt;/value&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;returns&gt;&lt;/returns&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;remarks&gt;&lt;/remarks&gt;</p>
<p dir="ltr">    Public ReadOnly Property ErrorMessage() As String</p>
<p dir="ltr">        Get</p>
<p dir="ltr">            Return _ErrorMessage</p>
<p dir="ltr">        End Get</p>
<p dir="ltr"> </p>
<p dir="ltr">    End Property</p>
<p dir="ltr"> </p>
<p dir="ltr">    Dim _Value As Object</p>
<p dir="ltr">    &#8221;&#8217; &lt;summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; Represents the value of the ibject, it could be any type .</p>
<p dir="ltr">    &#8221;&#8217; &lt;/summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;value&gt;&lt;/value&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;returns&gt;&lt;/returns&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;remarks&gt;&lt;/remarks&gt;</p>
<p dir="ltr">    Public Property Value() As Object</p>
<p dir="ltr">        Get</p>
<p dir="ltr">            Return _Value</p>
<p dir="ltr">        End Get</p>
<p dir="ltr">        Set(ByVal value As Object)</p>
<p dir="ltr">            _Value = value</p>
<p dir="ltr">        End Set</p>
<p dir="ltr">    End Property</p>
<p dir="ltr">#End Region</p>
<p dir="ltr"> </p>
<p dir="ltr">#Region &#8220;Methods&#8221;</p>
<p dir="ltr"> </p>
<p dir="ltr">    Public Sub New()</p>
<p dir="ltr"> </p>
<p dir="ltr">    End Sub</p>
<p dir="ltr">    &#8221;&#8217; &lt;summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; Sets the Error Message</p>
<p dir="ltr">    &#8221;&#8217; &lt;/summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;param name=&#8221;Message&#8221;&gt;&#8221;the message of the error that will be presented in Error Message property&lt;/param&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;remarks&gt;&lt;/remarks&gt;</p>
<p dir="ltr">    Public Sub SetErrorMessage(ByVal Message As String)</p>
<p dir="ltr">        _ErrorMessage = Message</p>
<p dir="ltr">        _HasErrors = True</p>
<p dir="ltr">    End Sub</p>
<p dir="ltr">    &#8221;&#8217; &lt;summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; resets the object so no errors are contained</p>
<p dir="ltr">    &#8221;&#8217; &lt;/summary&gt;</p>
<p dir="ltr">    &#8221;&#8217; &lt;remarks&gt;&lt;/remarks&gt;</p>
<p dir="ltr">    Public Sub Reset()</p>
<p dir="ltr">        Me._HasErrors = False</p>
<p dir="ltr"> </p>
<p dir="ltr">    End Sub</p>
<p dir="ltr">#End Region</p>
<p dir="ltr">End Class</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">الآن لنقم بعمل مثال عملي جديد لنجرب استخدام هذه الفئة ، اما بخصوص مثالنا السابق والفئة MyData فاعتبره تمرينا لك لحل مشكلتنا الأساسية !</p>
<p dir="rtl"> </p>
<p dir="rtl">في الوحدة النمطية Module1 التي تحتوي على الطريقة Main &#8211; الجزء الاساسي من البرنامج بطبيعة الحال &#8211; فقد قمت باضافة الدالة التالية فيها :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">    Function WriteOnTheScreen() As ExecutionCondition</p>
<p dir="ltr">        Dim mExCn As New ExecutionCondition</p>
<p dir="ltr"> </p>
<p dir="ltr">        Try</p>
<p dir="ltr">            Console.WriteLine(5 / 1)</p>
<p dir="ltr">            Console.ReadLine()</p>
<p dir="ltr"> </p>
<p dir="ltr">            mExCn.Reset()</p>
<p dir="ltr"> </p>
<p dir="ltr">        Catch ex As Exception</p>
<p dir="ltr">            mExCn.SetErrorMessage(ex.Message)</p>
<p dir="ltr">        End Try</p>
<p dir="ltr"> </p>
<p dir="ltr">        Return mExCn</p>
<p dir="ltr">    End Function</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">وفي الطريقة Main كتبت الكود التالي :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">    Sub Main()</p>
<p dir="ltr">        &#8216;لنجرب تنفيذ الدالة</p>
<p dir="ltr">        &#8216;WriteOnTheScreen</p>
<p dir="ltr">        If WriteOnTheScreen.HasErrors = True Then</p>
<p dir="ltr">            Console.WriteLine(WriteOnTheScreen.ErrorMessage)</p>
<p dir="ltr">        End If</p>
<p dir="ltr">        Console.ReadLine()</p>
<p dir="ltr">    End Sub</p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">بعد تشغيل البرنامج سيظهر كل شيء على ما يرام هذه المرة وسيطبع 5 ، لنجرب الآن تعديل الطريقة WriteOnTheScreen ولنجعل القسمة مبنية على صفر وهذا خطأ رياضي فادح جدا :</p>
<p dir="rtl">
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="568" valign="top">
<p dir="ltr">    Function WriteOnTheScreen() As ExecutionCondition</p>
<p dir="ltr">        Dim mExCn As New ExecutionCondition</p>
<p dir="ltr"> </p>
<p dir="ltr">        Try</p>
<p dir="ltr"> </p>
<p dir="ltr">            Dim x As Integer = 5</p>
<p dir="ltr">            Dim y As Integer = 0</p>
<p dir="ltr">            Dim z As Integer = x / y</p>
<p dir="ltr">            Console.WriteLine(z)</p>
<p dir="ltr">            Console.ReadLine()</p>
<p dir="ltr"> </p>
<p dir="ltr">            mExCn.Reset()</p>
<p dir="ltr"> </p>
<p dir="ltr">        Catch ex As Exception</p>
<p dir="ltr">            mExCn.SetErrorMessage(ex.Message)</p>
<p dir="ltr">        End Try</p>
<p dir="ltr"> </p>
<p dir="ltr">        Return mExCn</p>
<p dir="ltr">    End Function</p>
<p dir="ltr"> </p>
</td>
</tr>
</tbody>
</table>
<p dir="rtl"> </p>
<p dir="rtl">الآن قم بتنفيذ البرنامج ولاحظ ماسيحدث ، سيطبع نص رسالة الخطأ مهما يكن نوع الخطأ الذي حدث ، سواء القسمة على صفر او أي خطأ آخر وتأكد من كلامي جيدا !</p>
<p dir="rtl"> </p>
<p dir="rtl">ختاما ارجو انني قد وفقت في لفت الانتباء الى مسألة التعامل مع الاخطاء في الكائنات المستقلة واذا وجد هنا أي خطأ فأرجو تنبيهي عليه وجل من لا يسهو .</p>
<p dir="rtl"> </p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/alnabhani.wordpress.com/37/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/alnabhani.wordpress.com/37/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/alnabhani.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/alnabhani.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/alnabhani.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/alnabhani.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/alnabhani.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/alnabhani.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/alnabhani.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/alnabhani.wordpress.com/37/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/alnabhani.wordpress.com/37/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/alnabhani.wordpress.com/37/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=alnabhani.wordpress.com&blog=454111&post=37&subd=alnabhani&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://alnabhani.wordpress.com/2008/07/22/executioncondition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="" medium="image">
			<media:title type="html">alnabhani</media:title>
		</media:content>
	</item>
	</channel>
</rss>