هل جربت بيئة العمل الجديدة من مايكروسوفت فيجوال ستديو كود
في هذه المقالة سوف نتعرف إلى بيئة العمل هذه واستخدامها في كتابة التطبيق المشهور “أهلا عالم” باستخدام بايثن
هل جربت بيئة العمل الجديدة من مايكروسوفت فيجوال ستديو كود
في هذه المقالة سوف نتعرف إلى بيئة العمل هذه واستخدامها في كتابة التطبيق المشهور “أهلا عالم” باستخدام بايثن
أصبح تصميم برامج منصة ويندوز لا يقل تقنيا عن مفاهيم المستخدمة في تطبيقات شبكة الإتصالات. في هذه المقالة سوف نتعرف إلى كيفية استخدام مكتبة من مايكروسوفت تدعى Prism. سوف تساعدك هذه المكتبة وغيرها من المكتبات المرتبطة بها على بناء تطبيقات ديناميكية ومرنة من حيث أنها تسمح لك بتحديد معالم المناطق Regions في النافذة الرئيسية لتطبيقك فبذلك تكون قادرا على تغير شرائح العرض Views أثناء عمل التطبيق. ولكن أولا دعنا نتعرف إلى بعض المفاهيم الأساسية والبسيطة!
بعد قراءة هذه المقالة ستكون قادرا استخدام مكتبة Prism.Unity من خلال
بإختصار مفهوم Shell هي الواجهة الرئيسية Master Windowأو Master Page بالنسبة لمطوري تطبيقات شكبة الإتصالات (ويب)
تتيح لك مكتبة Prism تعريف مناطق داخل الواجهة الرئيسية Shell لتمكنك من إضافة شرائح العرض Views أثناء عمل البرنامج
شرائح العرض هي مفهوم العنصر مادون النافذة Window. هذه قد تمثل UserControl أو custom control. شريحة أو شرائح العرض ستظهر ضمن المناطق أو الأماكن Regions التي تم تحديدها داخل الواجهة الرئيسية Shell . بإختصار فإن عملك ستركز على شرائح العرض Views بعد أن تكون قد أتممت بناء واجهتك الرئيسية Shell و رسمت المناطق داخلها.
لاحظ الشكل التالي فإن Shell تمثل قالب الواجهة التي تراها ومن ثم فإن المناطق المعرفة عديدة منها Main Region و MainToolBarRegion و ResearchRegion وأخير فإن شرائح العرض Views هي عبارة عن العناصر التي تراها داخل كل منطقة
إذا كانت هذه المرة الأولى التي تنشء فيها قاعدة بيانات ماي سكول فهذه المقالة تناسبك تماما.
بعد أن تكون قد أتممت عملية تنصيب MySQL Workbench بنجاح
هل احتجت في يوم أو في مهمة إلى تغير نوع كائن object إلى كائن غير معرف (anonymous type)؟ الأمر في غاية البساطة:
private T ConvertTo<T>(T typeHolder, object obj) => (T)obj; |
ولكن قد تتساءل ما الحاجة لهذه المعلية وخاصة أن شرط التحويل أن يكون الكائن object هو فعلا يمثل كائن غير معرف حتى يتم التحويل بشكل ناجح وصحيح.
تساؤلك في محله والجواب انه قد تحتاج إلى إنشاء نسخة ثانية أو ثالثة من كائن غير معرف (anonoymous type) باستخدام
FormatterServices أو Activator.
ملاحظة: هناك فرق في قدارت كلا الفئتين Activatior و FormatterServices. في حين أن Activator تتطلب منك مسبقا معرفة شكل الباني من حيث القيم الممررة (برامترات) إذ أن الأنواع غير مسبقة التعريف لا تحتوي على باني افتراضي أو باني بدون قيم ممررة (Parameterless Constructor) وهذا سوف يسبب متاعب خاصة مع الأنواع المعقدة (Complex Type)
var car = new { Maker = “BMW”, Type = “Sedan”, Year = 2017 }; |
5ø4 |
|
Maker |
Mercedes-Benz |
Type |
Four-Wheels |
Year |
1995 |
ولكن ماذا عن المثال التالي:
var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } }; |
6MissingMethodException4 |
Constructor on type ‘<>f__AnonymousType1`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[<>f__Anonymou… |
المشكلة أن القيم الممررة لم تكن توافق شكل الباني
الحل الثاني هو استخدام FormatterService التي توفر عدد من التوابع لإنشاء نسخة من كائن object الميزة التي تقدمها أنها ستقوم بإنشاء نسخة من كائن دون استدعاء الباني
var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } }; |
5ø4 |
|
Maker |
null |
Owners |
null |
لكن التابع GetUninitializedObject سوف يعيد نسخة لكن من نوع object وبالتالي نحتاج إلى عمل تغير نوع من object إلى نوع الكائن المجهول. علينا استخدام التابع المعرف في أول المقالة على النحو التالي:
private T CastTo<T>(T typeHolder, object obj) => (T)obj;
var complexCar = new { Maker = “BMW”, Owners = new { First = “Ahmad”, Second = “Yaser” } }; |
المصادر:
[1]. https://stackoverflow.com/a/1409776/2696230
[2]. https://connect.microsoft.com/VisualStudio/feedback/details/521722/system-activator-createinstance-throws-system-missingmethodexception-with-constructor-containing-an-optional-parameter
الأمر بسيط Notepad++ يوفر هذه الإمكانية
من قائمة Edit ←Line Operations ← Join Lines (لاحظ الصورة 1)
الصورة 1 توضح كيفية دمج أسطر نص مع بعضها البعض لتصبح سطر واحد فقط
بعض الحالات المفيدة ، مثل اسناد قيمة إلى متحول (variable) ، فمثلا اذا كان لديك ملف من هيئة xml وأردت أخذ محتواه واسناده إلى متحول سيكون من اللازم تحويل نص الـ xml إلى سطر واحد قبل اسناده.
السلام عليكم ورحمة الله،،
أهلا ومرحبا بكم،،
في هذه المقالة القصيرة سنتعرف إلى طرق مختلفة للتبديل بين حقلين two variables. بشكل عام عملية التبديل تعرف باسم تبديل قيم حقلين swap. من بدأ بتعلم البرمجة سيمر على حالة قد يحتاج فيها إلى تبديل قيم حقلين ليصبح الحقل الأول يحمل قيمة الحقل الثاني، في حين تصبح قيمة الحقل الثاني هي قيمة الحقل الأول سابقا قبل التبديل. الطريقة التقليدية التي نعرفها وهي باستخدام حقل إضافي ثالث ليقوم بدور الوسيط ليقوم بحفظ قيم أحد الحقلين من الضياع أثناء إجراء عملية التبديل. لكن هل تعلم أنه بإمكانك إجراء عملية التبديل هذه بطرق أخرى دون الحاجة إلى حقل ثالث وسيط.
قد تتعجب وتتسائل ما الحاجة إلى طرق أخرى إن كانت الطريقة التقليدية تفي بالغرض؟!ّ الجواب هو إذا كنت تبرمج الأجهزة الصغيرة التي لا تتعدى ذاكرتها عدة بايتات فقط , عندها ستضطر إلى البحث عن طرق أخرى للتقليل من استهلاك الذاكرة أو حتى في حال عدم وجود مساحة كافية في الذاكرة لاستخدام أي حقل إضافي.
دعنا نقم أولا بعرض طريقة الكود التقليدي. كود1 يعرض عملية التبديل باستخدام العملية الحسابية. طبعا كلمة ref تستخدم في لغة السي شارب C# وهي تكافئ تماما & في لغة السي بلس بلس (C++)
كود 1. التبديل بين الحقول Variables باستخدام حقل إضافي
void Swap(ref int a, ref int b) c = a; |
لاحظ في كود2 التالي تم استخدام عمليات الجمع والطرح للتبديل بين الحقول دون الحاجة إلى حقل إضافي. الكود الجديد فيه ميزة وعلة. الميزة توفير مساحة في الذاكرة فلا حاجة لحقل ثالث. أما العلة فهي قد يحصل Overflow طفحان بسبب ناتج جمع قيميتين قد ينتج عنه عدد كبير لا يمكن استيعابة في الحقل الحالي. كود3 يحل هذه المشكلة باستخدام exclusive-OR
كود 2. التبديل بين الحقول Variables باستخدام العمليات الحسابية (الجمع والطرح)
void Swap(ref int a, ref int b) |
في الكود التالي تم استخدام exclusive-OR ، وهو عميلة تتم على مستوى البتات (قيم ثنائية 1 أو 0) يمكن مراجعة موقع مايكروسوفت (انقر هنا) لتحصل على المزيد من الشرح أفضل من السابق بسبب أن إحتمال حدوث فائض غير وارد.
كود 3. التبديل بين الحقول Variables باستخدام exlusive-OR
static void Swap(ref int a, ref int b) |
في نهاية هذه المقالة ستكون قد تعرفت على طرق مختلفة للتبديل بين حقلين بثلاث طرق:
هذا الكود مقتبس من كتاب مايكروسوفت Programming in C#. في هذا الكود فقط أود أن أتطرق إلى نقطة وهي أيّ (بتشديد الياء) التابعين أفضل من حيث البيانات (البرامترات) الممررة إليه؟
سأترك لك أولا وقت للتفكير،،
//LISTING 1 Passing a complete customer to a method
public Distance CalculateDistanceTo(Customer customer)
{
Distance result = … // Some difficult calculation that uses customer.Address
return result;
}
//LISTING 2 Passing only an address to a method
public Distance CalculateDistanceTo(Address address)
{
Distance result = … // Some difficult calculation that uses address
return result;
}
لكن إن أردت إشارات لتساعدك على الإختيار بنفسك فلك ذلك، سأطرح عليك بعض النقاط
1. أيّ الكودين يعتبر أوضح و أسهل للفهم من حيث البيانات المطلوبة لإجراء عملية حساب المسافة؟
2. أيّ الكودين فيه سهولة في الصيانة مقارنة بالآخر؟ أو بمعنى آخر أي الكودين يمكننا استخدامه أكثر من الآخر دون إجراء تعديلات؟ مرة أخرى ركز على البيانات (البرامتر) الممرر لكلا التابعين.
طبعا الإجابة على كلا السؤالين هو الكود الثاني.
بالنسبة للسؤال الأول،،
طبعا الكود الثاني أوضح وأسهل للفهم وذلك لأنه واضح من حيث متطلبات عمله فهو يطلب عنوان حتى يقوم بعملية حساب المسافة، في حين أن التابع الأول مبهم، فأنت ببساطة لا يمكنك استنباط أي البيانات التي يحتاجها التابع من الكائن من صنف Customer للعمل. بمعنى آخر لا تعلم أي البيانات المجودة داخل هذا الكائن من صنف Customer التي سوف يعتمد عليها في تقرير المسافة ربما يكون العنوان وقد يكون رمز المنطقة Postcode أو رمز الهاتف لتحديد المدينة أو…
قد يتبادر إلى ذهنك وما المشكلة في ذلك؟ لنفترض أنك تريد حساب المسافة لكل الزبائن المعروضين في جدول للزبائن الذين أجروا عملية شراء خلال الشهر الماضي في أحد واجهات لتطبيقك الجميل. طبعا الجدول لن يحتوي جميع معلومات الزبائن وإنما يعرض فقط بعض المعلومات عنهم. عندما تريد أن تحسب المسافة لزبون معين ستضطر عندما تستخدم التابع الأول لتأمين معلومات الزبون كاملة من قاعدة البيانات قبل تمريرها للتابع الأول لتتم عملية الحساب، بينما التابع الثاني لا يتطلب منك سوى العنوان والذي في أغلب الظن قد يكون متوفر ولا تحتاج إلى الاستعلام عنه من قاعدة البيانات. على كل إن لم تقتنع فلا مشكلة فالسبب الثاني سيكون كفيل بتبيهك إلى أمر أكثر أهمية والذي ستخلص من خلاله إلى أن تصميم الكود الثاني هو الأفضل بلا منازع.
بالنسبة للسؤال الثاني،،
لنفترض بعد مدة من الزمن تم التعديل على الصنف Customer ليحتوي حقل جديد WorkAddress مالذي سوف يحدث؟! لن تكون قادرا على استخدام التابع الأول لحساب المسافة باستخدام الحقل الجديد WorkAddress. أليس كذلك؟! ومع ذلك إن ألححت بمقدرتك على استخدام التابع الأول سيتطلب منك تعديل التابع الأول حتى يتثنى لك حساب المسافة لكل من Address و WorkAddress. لن أتطرق إلى كيفية التعديل، إذا أنه ومع الشروع بالتعديل ستكتشف العديد من المشاكل الأخرى. في حين وبكل سهولة يمكنك حساب المسافة للحقل الجديد WorkAddress بتمريره كبرامتر إلىه. حالة أخرى توضح مدى المشاكل التي يمكن أن تحصل فقط جراء سوء تصميم التابع الأول. لنقل أننا أردنا استخدام التابع مع مشروع آخر أو مع صنف آخر مثل Student، مرة أخرى لا يمكنك استخدام التابع الأول حيث أن Customer غير Student وبالتالي سيتطلب إجراء تعديلات ليتلائم التابع الأول مع الصنف الجديد Student. بينما لو استخدمنا التابع الثاني لن نواجه أي من المشاكل السابقة وعلى العكس ستشعر بمتعة حسن تصميم التابع.
الخلاصة: ان التابع الثاني أفضل من التابع الأول فهو سهل الفهم وأيضا لا يتطلب عملية تعديل على أقل تقدير للحالات آنفة الذكر.
السلام عليكم ورحمة الله وبركاته،،
أهلا وسهلاً،،
بإمكانك التعرف على “فاصل الأنماط” وكيفية استخدامه
بعد مشاهدة المقطع المرئي ستكون قادر على:
بالإضافة إلى ما تعلمناه سابقا فإنه يوجد ضمن فضاء الأسماء System.Collections صفوف القواميس التي تدل من اسمها أنها مثل القاموس تقوم بتخزين قيمة تسمى “مفتاح” وقيمة تسمى “قيمة المفتاح”، وبالتالي تكون الافادة في عملية البحث عن القيمة المقابلة لمفتاح ما، من هذه الصفوف الصف Hashtable الذي يمكن استخدامه كما يلي:
Hashtable emailLookup = new Hashtable();
emailLookup.Add(“Abdulkarim2006@hotmail.com”, “Kanaan, Abdulkarim”);
emailLookup[“Abdulkarim.Kanaan@gmail.com”] = “Kanaan, Abdulkarim”;
ربما يخطر ببالك يوما أو لم يخطر، سواء سمعت ام لم تسمع أنه بامكانك ارسال كائن من حاسبك إلى حاسب آخر، طبعا صدق فهذا الكلام صحيح، أو يمكن القول انه ايضا ارسال كائن مثلا من برنامج إلى آخر، تعرف هذه العملية تمثيل الكائن بالـ Serialization، إحدى الطرق في ذلك هو تمثيل الكائن بصيغة XML.