‫تفاوت Load و Get در NHibernate

برای فراخوانی رکوردها از دیتابیس (بر اساس primary key) به حافظه دو راه در NHibernate وجود دارد. یکی Get و دیگری Load. متود Get برای دستیابی به رکورد مربوطه مستقیماً به cache یا database مراجعه می‌کند در حالی که متود Load تا زمانی که کسی propertyی غیر از id را فراخوانی نکرده به دیتابیس مراجعه نمی‌کند. بنابراین متود Load برای ایجاد reference به آبجکت خیلی مناسب‌تر است. مثلاً با استفاده از Load می‌توان رفت و آمد به دیتابیس را در فرایندهای Update کاهش داد. برای کسب اطلاعات بیشتر به اینجا و اینجا مراجعه کنید.

‫اندازه گیری سرعت صفحات ASP.NET

وقتی که صفحات سایت شما کند هستند مجبور هستید راهی را برای یافتن علت آن پیدا کنید. من چند نکته‌ی مفید در این رابطه پیدا کرده‌ام. این نکات بدون توجه به تعاریف دقیق فنی عبارتند از:

۱- یکی از دقیق‌ترین ابزارها برای اندازه‌گیری سرعت صفحات ASP.NET استفاده از Performance Monitor در ویندوز ۲۰۰۸ است.

با استفاده از این ابزار می‌توانید بفمهید اجرای صفحه مورد نظر شما چقدر طول می‌کشد و در کدام یک از مراحل اجرای کد دات‌نت قرار دارد. سه تا از counterهای مفید عبارتند از

  • ‭% Time in Jit (.Net CLR Jit)
  • ‭Request Execution Time (ASP.NET Apps)
  • ‭Requests/Sec (ASP.NET Apps)

۲- ابزار دیگری که بدون دسترسی به سرور هم قابل استفاده است و بیشتر روی مراحل مختلف ساخت شی Page متمرکز است، عبارت است از ابزار Trace.

برای فعال کردن این امکان در ASP.NET باید تنظیمات زیر را در مدخل system.web در web.config قرار دهید:


۳- حواستان باشد زمان مورد نیاز برای JIT را به حساب کندی برنامه نگذارید. dllهای دات‌نت به زبان IL هستند و برای اجرا نیاز دارند به کد ماشین ترجمه شوند. انجام این کار به عهده JIT هست. وقتی که یک برنامه ASP.NET را در IIS قرار می‌دهید، با اولین درخواست برای هر صفحه، کد آن توسط JIT تبدیل به کد ماشین می‌شود. این تبدیل فقط یک بار انجام خواهد شد و برای دفعات بعد cache خواهد شد.

‫if تنفر انگیز

به این if توجه کنید:
//code...

if (something != null)
{
Do1();
Do2();
}

//code...
در اینجا null نبودن بررسی شده و بر اساس آن یک سری عملیات انجام می‌شود. اما دقت کنید که اگر مقدار مورد نظر null باشد هیچ مکانیزمی برای اعلام خطا وجود ندارد و به سادگی هر چه تمام‌تر آن بخش از کد بی هیچ سر و صدایی skip خواهد شد. درست است که بعضی جاها null بودن لزوماً به معنای خطا نیست اما اگر نمونه کدی ببینید که تمام ifهای آن به همین سبک هستند حتماً از این ifها متنفر خواهید شد.

مروری بر مفاهیم بانک اطلاعاتی

گاهی اوقات لازم است که آدم به عقب برگشته و بعضی مفاهیم که قبلاً بلد بوده را دوباره مرور کند. یک سری از این مفاهیم که همیشه مورد نیاز هستند مربوط هستند به مفاهیم دیتابیس. فهرست زیر تعدادی از آنها را شامل می‌شود.

integrity – جامعیت
صحت داده‌ها، مثلاً موجودی حساب بانکی منفی نباشد

Domain Integrity – جامعیت دامنه‌ای
یعنی تمام صفات در تمام رابطه‌ها از نوع دامنه خود باشند. مثلاً تعداد فرزندان یک شخص نباید اعشاری باشد.

Intra-relation Integrity – جامعیت درون رابطه‌ای
یعنی هر رابطه‌ای به تنهایی صحیح باشد. مثلاً همه کلیدهایش درست باشد.

Referential Integrity – جامعیت ارجاع
یعنی کلید خارجی درست تعریف شده باشد. مثلاً کلید خارجی یک رابطه حتماً در رابطه دیگر کلید باشد.

consistency – هم خوانی
اطلاعات مختلف سیستم با هم در تضاد نباشد. مثلاً نام شخص در جاهای مختلف سیستم یکی باشد.

impedance mismatch – ناهمگونی مانع
همان تفاوتی که بین زبان SQL و C#‎ وجود دارد و ORMها مدعی حل آن هستند.

Super Key – ابرکلید
هر ترکیبی از صفت‌ها که خاصیت کلید داشته باشد. این کلید کمینه نیست. یعنی زیر مجموعه‌ای از آن هم می‌تواند کلید باشد. مثل «شماره دانشجویی» و «شمار دانشجویی و نام دانشجو»

Candidate Key – کلید کاندید
هر ترکیبی از صفت‌ها که کلید کمینه باشد. یک رابطه ممکن است چند کلید کاندید داشته باشد.

Primary Key – کلید اصلی
یکی از کلیدهای کاندید است که توسط مدیر بانک اطلاعات انتخاب شده.

Alternative Key, Secondary Key – کلید فرعی
یکی دیگر از کلیدهای کاندید است که برای برخی کاربردها انتخاب می‌شود.

Foreign Key – کلید خارجی
صفتی است در یک رابطه که در رابطه‌ی دیگری کلید اصلی (یا فرعی) است و برای برقراری ارتباط بین دو رابطه استفاده می‌شود.

Projection پرتو
انتخاب تعداد محدودی از ستون‌ها نه همه آنها

Having
اعمال شرط روی دستورات Group By

Normalization – نرمال سازی
از بین بردن افزونگی داده‌ها (Data Redundancy) با استفاده از فرم‌های نرمال‌سازی 1NF، 2NF و 3NF و گاهی اوقت BCNF

ضرب دکارتی
select * from city, country

join و inner join
هر دو یکی هستند. به معنی پیوند دو جدول با لحاظ شرط مربوطه

left join و left outer join
هر دو یکی بوده و مثل inner join عمل می‌کند منتها سمت چپ رابطه را همیشه می‌آورد حتی اگر به ازای آن چیزی وجود نداشته باشد.

right join و right outer join
برعکس right join

full outer join
ترکیب left join و right join

منابع:

اتاق چینی

بعضی وقت‌ها که در بیان منظور یا انتقال احساسم خیلی عاجز هستم ولی به نحوی موفق می‌شوم راهی برای توضیح مفهوم مورد نظرم پیدا کنم خیلی خوشحال می‌شوم. یکی از دفعاتی که اخیراً دچار این خوشحالی شدم مربوط است به وقتی که عبارت «اتاق چینی» را یاد گرفتم.

«اتاق چینی» اصطلاحی است که بعضی منتقدین علیه هوش مصنوعی به کار می‌برند. منظور آنها این است که ممکن است یک کامپیوتر بتواند مانند یک انسان حرف بزند اما واقعیت آن است که او واقعاً درکی از حرف زدن ندارد. البته «اتاق چینی» دقیقاً نام یک آزمایش فرضی است. فرض کنید شخصی که اصلاً چینی بلد نیست داخل اتاقی دربسته نشسته باشد. شخص دیگری که بیرون از اتاق قرار دارد، یک سوال چینی روی کاغذ نوشته و آن را از زیر در به داخل اتاق می‌فرستد. شخص داخل اتاق با استفاده از کتابچه راهنمایی که فقط تصویر کلمات و عبارات چینی در آن قرار دارد، کلمه چینی جواب را پیدا کرده، آن را روی کاغذ کشیده و به بیرون در می‌فرستد. از نگاه آن شخص بیرون اتاق، شخص داخل اتاق چینی می‌فهمد در حالی که ما می‌دانیم او چینی بلد نیست و هیچ درکی از زبان چینی ندارد. ر.ک. اینجا.

من هم خیلی وقت‌ها حس می‌کنم داخل «اتاق چینی» هستم. یعنی چیزی را که دیگران می‌گویند متوجه می‌شوم اما درک نمی‌کنم. مثلاً شروع به پیاده‌سازی بخشی از Business یک برنامه می‌کنم اما خودم نمی‌فهمم منطق واقعی چیست. چون از شخص ثالثی برای انجام آن کمک می‌گیرم. نتیجه آن که اگر آن شخص در کنارم نباشد هیچ وقت نمی‌توانم کدی را که خودم نوشته‌ام را دیباگ کنم یا توسعه دهم.

‫کتاب‌های NHibernate

یکی از بزرگترین مشکلات موجود بر سر راه هر فناوری یا ابزاری کمبود منابع یادگیری علی‌الخصوص کتاب در مورد آن است. خوشبختانه این محدودیت‌ها رفته رفته در مورد NHibernate رفع گردیده و علاوه بر وبلاگ‌ها و انجمن‌های پرسش و پاسخ، چند کتاب و منبع مفید هم در مورد آن منتشر شده. در ادامه مروری داریم بر آنها:

NHibernate 3.0 Cookbook

اگر با مفهوم Cookbook به طور کلی آشنایی داشته باشید به خوبی متوجه نوع مطالب این کتاب خواهید شد. Cookbook معمولاً به کتاب‌های راهنمای آشپزی گفته می‌شود که در هر یکی دو صفحه آن دستور پخت یک نوع غذا نوشته شده است. در این طور کتاب‌ها معمولاً خیلی کم از مباحث تئوریک و آکادمیک سخن به میان می‌آید. علاوه بر این پیوستگی مطالب در این طور کتاب‌ها خیلی کم است. مثلاً شما می‌تواند بدون خواندن ۱۰۰ صفحه اول کتاب مستقیماً به سراغ دستور غذای توضیح داده شده در صفحه ۱۰۱ رفته و آن را اجرا کنید.
این کتاب ۳۲۸ صفحه‌ای هم دقیقاً همین روش را در مورد NHibernate دنبال می‌کند. یعنی در هر یک از ۷۰ دستورالعمل آن یکی از امکانات، تنظیمات یا شرایط NHibernate به طور کاملاً عملی توضیح داده شده است. مزیت این کتاب در این است که شما می‌توانید مستقیماً به آن بخشی که نیاز دارید مراجعه کرده و مجبور نباشید مقدمات آن را بلد باشید. درست مثل این که به یک Community مرتبط مراجعه کرده و یا از یک همکار واردتر از خودتان بپرسید. جالب است بدانید نویسندگان این کتاب از فعالان پروژه NHibernate و Communityهای مربوطه هستند.

NHibernate In Action


این کتاب بر اساس کتاب مشابهی برای Hibernate (جاوا) نوشته شده و در دنیای Hibernate/NHibernate مرجع استاندارد یادگیری Hibernate/NHibernate می‌باشد. کتاب پشتوانه تئوریک خیلی خوبی دارد و سعی کرده همه مباحث را از مقدماتی تا کامل پوشش دهد. این کتاب شبیه کتاب‌های درسی است یعنی ترتیب مطالب آن باید تا اندازه‌ای حفظ شود. چون بیشتر مطالب وابسته هستند به مطالبی که در فصول قبل توضیح داده شده‌اند. در نتیجه این کتاب برای کسانی مناسب است که وقت مناسبی داشته و می‌خواهند NHibernate را از سیر تا پیاز یاد بگیرند. به عبارت دیگر اگر شما در به کارگیری NHibernate کمی عجله داشته و یا صرفاً با مباحث خاصی از آن کار دارید بهتر به سراغ کتاب NHibernate 3.0 Cookbook بروید.
این کتاب کاملاً بر خود NHibernate متمرکز است و خبری از امکانات جانبی NHibernate در آن نیست. حتی از LINQ-to-NHibernate هم چیزی در این کتاب گفته نشده. نکته آخر در مورد این کتاب این که ویرایش جاری آن در حال حاضر یعنی بهمن ۱۳۸۹ بر اساس NHibernate 2.1 است. هر چند که مفاهیم توضیح داده شده در این کتاب در NHibernate 3.0 هم قابل استفاده است، اما اگر این موضوع اذیت‌تان می‌کند می‌توانید کمی صبر کنید. زیر احتمالاً به زودی ویرایش جدیدی از این کتاب بر اساس NHibernate 3.0 منتشر خواهد شد.

NHibernate Reference Documentation & API Version: 3.0.0


هر چند که این منبع یک کتاب غیر رسمی است و منتشر نشده است، اما این منبع، مرجع اصلی و رسمی در مورد NHibernate است. این کتاب همچون دیگر کتاب‌های مرجع تمام جزییات و امکانات NHibernate را از سیر تا پیاز ردیف کرده است. یادگیری و حتی استفاده‌های متوسط از این کتاب کمی سخت است. در نتیجه این کتاب بیشتر مناسب وقتی است که می‌خواهید تمام جزییات و شرایط یک امکان خاص را پیدا کرده و مورد استفاده قرار دهید.

NHibernate 2 Beginner’s Guide


یک کتاب مقدماتی در مورد کار با NHibernate که ظاهراً نمونه کدهای آن VB.NET می‌باشد. این کتاب از سطح بسیار پایینی شروع کرده و می‌تواند برای برنامه‌نویسان بسیار تازه کار واقعاً مفید و آموزنده باشد. البته اگر آشنایی مختصری با NHibernate یا حتی دیگر ORMها دارید توصیه می‌شود از این کتاب استفاده نکنید چون چیز زیادی در آن پیدا نخواهید کرد.

NHibernate with ASP.NET ProblemDesignSolution (Wrox Blox)‎


این کتاب الکترونیکی حدوداً ۱۲۰ صفحه‌ای بسیار ساده نوشته شده و مقدمات استفاده از NHibernate را در یک برنامه ASP.NET بیان می‌کند. در این کتاب فقط چند بحث اولیه‌ی NHibernate استفاده شده است. این کتاب مناسب برنامه‌نویسان ASP.NETی است که می‌خواهند برای اولین بار از NHibernate در برنامه‌شان استفاده کرده ولی نمی‌خواهد درگیر جزییات آن شوند.

نکته:
آخرین نسخه NHibernate در حال حاضر یعنی بهمن ۱۳۸۹ نسخه ۳ می‌باشد. هر چند که بعضی بخش‌های NHibernate از نسخه 2.1 به 3.0 تغییر چندانی نداشته‌اند اما حواستان به نسخه ذکر شده در هر کدام از کتاب‌ها باشد.

‫معرفی کتاب Pro C# 2008 and the .NET 3.5 Platform

خواندن این کتاب را مدت‌ها پیش شروع کرده بودم اما تا حالا فرصتی نشده بود که نظرم را راجع به آن بگویم. این کتاب حجیم ۱۴۰۰ صفحه‌ای همه چیز را راجع به C# 2008 به آدم یاد می‌دهد و می‌تواند به عنوان یک مرجع دائمی مورد استفاده قرار گیرد. مطالب این کتاب آنقدر جامع و کامل هستند که حتی در فصول مقدماتی و ساده آن هم می‌تواند چیزی را برای یادگیری پیدا کرد. این کتاب شامل ۳۳ فصل و ۲ ضمیمه می‌باشد.

فصل اول و دوم مقدماتی راجع به دات‌نت و C#‎ می‌گویند که دانستن آنها مفید خواهد بود. خصوصاً فصل اول که ابزار پراستفاده ildasm.exe را معرفی می‌کند.

فصل ۳ و ۴ ساختارهای اصلی C#‎ را توضیح می‌دهد که فکر می‌کنم هر کسی که کمی C#‎ بلد باشد اینها را هم بلد باشد.

فصل ۵ و ۶ راجع به ساختار شی گرا در زبان C#‎ می‌باشد. خواندن این فصل خصوصاً فصل ۶ به کسانی که می‌خواهند C#‎ را به خوبی بفهمند توصیه می‌گردد.

فصل ۷ راجع به Exception Hadling است. خیلی برنامه‌ها بدون یک Exception Handling خوب هم کار می‌کنند. اما یک Exception Handling خوب تاثیر زیادی در کیفیت برنامه دارد و باعث می‌شود خطایابی و نگهداری آن خیلی راحت‌تر باشد.

فصل ۸ راجع به چرخه زندگی Objectها در C#‎ است. دانستن مطالب این فصل برای مواقعی که بعضی چیزها را در C#‎ نمی‌فهمید خیلی مفید است. مع الوصف بنده به شخصه دانستن این اطلاعات را ضروری می‌دانم.

فصل ۹ و ۱۰ راجع به Interfaceها و Collectionها و Generic می‌باشد. ناگفته پیداست که دانستن این‌ها هم برای یک برنامه‌نویس حرفه‌ای خصوصاً آنها که به طراحی هم علاقه دارند خیلی لازم است.

فصول ۱۱ الی ۱۳ راجع به امکاناتی از C#‎ صحبت می‌کند که هم جز مباحث پیشرفته و به در بخور آن محسوب می‌شوند و هم مقدمه‌ای بر LINQ هستند. یعنی استفاده موثر از LINQ بدون آنها امکان پذیر نیست. برخی مطالب این سه فصل عبارتند از Delegate، Event، Lambda، Indexer، Automatic Properties و Extension Methodها.

فصل ۱۴ اختصاص دارد به مقدمه‌ای از LINQ. اگر این مقدار از LINQ کارتان را راه نینداخت که قریب به یقین همین طور است باید از منابع دیگری برای یادگیری تکمیلی LINQ استفاده کنید. بنده خودم به شخصه از کتاب LINQ in Action استفاده کردم.

فصول ۱۵ الی ۱۹ کلاً راجع به اسمبلی‌ها یا همان dllها و مباحث مرتبط با آنهاست. راجع به ساختار داخلی آنها، کار با آنها از طریق Reflection، مسائل مرتبط با AppDomainها، برنامه‌های چند ریسمانی (Multi Thread) و CIL و Dynamic Assemblies. به نظر شخصی من مطالب این چند فصل آنقدر خاص هستند که ممکن است خیلی‌ها هیچ وقت به آن نیاز پیدا نکنند. توصیه می‌کنم بعد از آن که فهمیدید هر کدام از این فصول راجع به چه موضوعی صحبت می‌کنند آنها را رها کرده و هر وقت که واقعاً به آنها نیاز داشتید به سراغشان بروید. بنده به شخصه فقط مبحث Reflection را مطالعه کردم و فکر هم می‌کنم حالا حالاها به غیر از مبحث چند ریسمانی به بقیه مطالب آن بی‌نیاز باشم.

فصول ۲۰ الی ۲۶ راجع به Class Library دات‌نت می‌باشند. بیشتر افراد با بعضی مطالب این فصول از قبل آشنا هستند و خیلی‌ها هم ممکن است هیچ نیاز پیدا نکنند و یا نخواهند که از بعضی از آنها استفاده کنند. مطالب این فصول به نظر من باید به صورت Reference مطالعه شوند. یعنی تا زمانی که واقعاً به آنها نیاز نشده نباید سراغشان رفت. مطالب این فصول عبارتند از IO، Object Serialization، ADO.NET، LINQ API، WCF و WF.

فصول ۲۷ الی ۳۳ کمی از خود C#‎ فاصله گرفته و به برنامه‌نویسی UI در دات‌نت می‌پردازند. این فصول مطالبی را راجع به Windows Forms، WPF و ASP.NET بیان می‌کنند. به نظر شخصی من جای این طور مطالب در یک کتاب تخصصی C#‎ نیست. یعنی اگر کسی بخواهد ASP.NET یاد بگیرد بهتر است به یک کتاب اختصاصی راجع به ASP.NET مراجعه کند نه یک کتاب C#‎. با توجه به این موضوع و با توجه به این که مطالب مطرح شده در این فصول خصوصاً در مورد ASP.NET کمی مقدماتی هستند، بنده هیچ کدام آنها را نخوانده و به کسی هم توصیه نمی‌کنم. خصوصاً این که خود من به دنبال درک بهتر C#‎ به سراغ این کتاب آمدم نه به دنبال یادگیری مقدماتی ASP.NET.

ضمیمه اول ممکن است به درد کسانی که مجبورند در دات‌نت از اشیای قدیمی COM استفاده کنند بخورد. ضمیمه دوم هم راجع به مونو است که فکر می‌کنم حالا دیگر حسابی out of date شده باشد.

پ. ن.: 
۱- ظاهراً این کتاب به فارسی هم ترجمه شده. نگاهی به اینجا بیندازید.

۲- بلد بودن بعضی مباحث که خودم آنها را غیر ضروری فرض کرده بودم برای قبولی در امتحان ۵۳۶ اجباری می‌باشد.

۳- اگر قرار باشد بار دیگر هم کتابی راجع به C#‎ بخوانم احتمالاً این دفعه نگاهی به کتاب C# in Depth بیندازم. آن هم به خاطر ارادت خاصی که نسبت به Jon Skeet پیدا کرده‌ام.

‫نگهداری داده‌های حجیم در MS SQL

در خانواده MS SQL نسخه‌های ۲۰۰۰، ۲۰۰۵ و ۲۰۰۸ تعدادی فیلد خاص برای کار با داده‌های حجیمی مثل عکس یا متون خیلی طولانی وجود دارد. هر کدام از اینها شرایط خاص خودشان را دارند که در ادامه بررسی خواهند شد.

char و varchar: حداکثر ۸۰۰۰ کاراکتر

varchar(max)‎: حداکثر ۲ میلیارد کاراکتر – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

nchar و nvarchar: حداکثر ۴۰۰۰ کاراکتر (به طور کلی ظرفیت انواع یونیکد نصف انواع غیر یونیکد است)

nvarchar(max)‎: حداکثر ۱ میلیارد کاراکتر – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

binary و varbinary: برای داده‌های غیر متنی و حداکثر ۸۰۰۰ بایت

varbinray(max)‎: برای داده غیر متنی و حداکثر ۲ گیگا بایت.

text: حداکثر ۲ میلیارد کاراکتر – این نوع داده قرار است به زودی حذف شود.

ntext: حداکثر ۱ میلیارد کاراکتر – این نوع داده قرار است به زودی حذف شود.

image: حداکثر ۲ گیگا بایت – این نوع داده قرار است به زودی حذف شود.

FileStream: نوعی ارتباط بین MS SQL و سیستم فایل ویندوز یعنی NTFS – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

Xml: نگهداری اطلاعات به صورت Xml – این نوع داده در SQL 2000 پشتیبانی نمی‌شود.

توصیه خود مایکروسافت برای نگهداری داده‌های حجیم استفاده از سه نوع varchar(max)‎ و nvarchar(max)‎ و varbinary(max)‎ است. زیرا انواع text و ntext و image دیگر پشیبانی نشده و در نسخ آتی MS SQL برداشته خواهند شد. جهت کسب اطلاعات بیشتر به اینجا و اینجا مراجعه کنید.

‫یک مثال عملی از Decoupling

من قبلاً هم راجع به Decoupling یا افتراق در نرم‌افزار خیلی چیزها می‌دانستم و همیشه عاشق مزایای آن بودم و دوست داشتم هر کدی که می‌نویسم Decoupling آن در سطح بالایی باشد. اما همان طور که همه می‌دانند یاد گرفتن یک ایده کار خیلی سختی نیست ولی عملی کردن آن چرا.

امروز موقعیت خوبی در یک برنامه ASP.NET پیش آمد که هم مزایای واقعی Decoupling (افتراق) را درک کنم و هم یک مثال ساده از آن اجرا کنم. یکی از امکاناتی که برای قسمت بندی بخش‌های مختلف برنامه و امکان Code Reuse در ASP.NET فراهم شده است امکان User Control است. برنامه‌نویس می‌تواند یک User Control نوشته و آن را در چند جای مختلف استفاده کند. یا حتی صرفاً از آن برای کاهش پیچیدگی استفاده کند. یکی از کارهای رایجی که خودم به شخصه در User Controlها انجام می‌دهم ارتباط با کنترل والد یا همان کنترلی است که کنترل مورد نظر من در آن قرار دارد. در موردی که من امروز با آن برخورد کردم User Control به Parent خود دسترسی پیدا کرده و از طریق FindControl یکی از دکمه‌های آن را Disable/Enable می‌کرد. این موضوع به غیر نازیبایی و ناخوانایی که ایجاد کرده بود باعث شده بود وقتی از این کنترل در جای دیگری استفاده می‌کردم خطا به وجود بیاید چون آن دکمه دیگر در اینجا وجود نداشت.

اعمال Decoupling (افتراق) در اینجا خیلی ساده بود. در User Control مورد بحث یک Event تعریف کردم و Disable/Enable کردن دکمه مورد نظر را به خود ماژول استفاده کننده سپردم. این ماژول فقط در Event تعریف شده مشترک می‌شد و Disable/Enable کردن دکمه را خودش انجام می‌داد. ماژول‌های دیگری هم که از User Control من استفاده می‌کردند هم صرفاً از همین Event استفاده می‌کنند. در واقع دیگر لازم نیست که User Control مورد نظر اطلاعی از وضعیت ماژول‌های والد خود داشته باشد و این یعنی Decoupling (افتراق).

برون‌سپاری خدمات تخصصی – ۶

طی پنج قسمت قبلی این مطلب سعی کردم مشکلاتی که سر راه برون‌سپاری خدمات تخصصی بین شرکت‌های داخلی و برنامه‌نویس‌ها به ذهنم می‌رسد را دسته‌بندی کنم. به نظر من به طور کلی ۴ نوع مشکل برای برون‌سپاری وجود دارد:

۱- عدم اطمینان کارفرماها (قسمت ۲)

۲- نبود ادبیات مشترک بین کارفرما، برنامه‌نویس‌ها و کارمندان شرکت مقصد (قسمت ۳)

۳- استاندارد نبودن کارها و بی‌نظمی در شرکت‌ها (قسمت ۴)

۴- عدم اطمینان برنامه‌نویس‌ها (قسمت ۵)

بنده مدت‌هاست که به این مشکل فکر می‌کنم و هیچ راه حل مناسبی به ذهنم نرسیده. به نظر می‌رسد بعضی مشکلات خارج از اراده برنامه‌نویس‌ها یا کارفرماهاست. مثلاً چون قوانین مرتبط با کار، مالیات و… به اندازه کافی بلوغ ندارند یا اگر هم دارند اجرای آنها با مشکلات بسیار زیادی مواجه است پس خود به خود نمی‌توان به امیدوار بود یخ عدم اطمینان طرفین به این زودی‌ها آب شود. به هر صورت امیدوارم روزی بتوان از این طریق چرخ صنعت (واقعاً صنعت؟) نرم‌افزار کشور را کمی سریع‌تر چرخاند. مثل همیشه منتظر نظرات دوستان هستم.

لینک نوشته‌های این سری:

برون‌سپاری خدمات تخصصی – بخش اول

برون‌سپاری خدمات تخصصی – ۲

برون‌سپاری خدمات تخصصی – ۳

برون‌سپاری خدمات تخصصی – ۴
برون‌سپاری خدمات تخصصی – ۵