عنوان:

‫چه منبع مطالعاتی برای تولید کنترل سفارشی پیشنهاد می‌کنید؟


نویسنده: هادی مزارعی
تاریخ: ۱۴۰۵/۰۵/۲۸ ۰۸:۳۸
آدرس: www.dntips.ir
برحسب نیازم تعدادی کنترل تحت نام Ces.WinForm.UI تولید کردم (بسیار آماتوری) که در بیشتر موارد، مجموعه‌ای از کنترل‌های قرار گرفته در کنار هم هستند. برای مثال برای ایجاد یک حاشیه در اطراف کنترل Form که کاربر امکان انتخاب رنگ داشته باشد از Panel استفاده شده که کاربر بتونه پهنای حاشیه را هم تنظیم کنه و اساسا خود Border اصلی دستکاری نشده است و همین روش کار را برای Title نیز انجام دادم و اساسا کاری روی Title اصلی ویندوز انجام نشده است.

جستجوی زیادی انجام دادم و مطالب بسیار پراکنده بودند و هدفمند نبودند. در جستجوها با کتاب Windows Internals آشنا شدم. اگرچه مطالب خوبی رو یاد گرفتنم ولی مطالبی در خصوص موضوع سوالم پیدا نکردم. علت مطرح کردن نام این کتاب این بود که دنبال کتابی میگردم که روی یک مساله عمیقا تمرکز کرده باشه که در این خصوص مشخصا دستکاری کنترل‌های ویندوزی و استفاده از توابع سطح پایین‌تر برای تولید کنترل‌های حرفه‌ای تر برای WinForm.

در انتها ممنون میشم منبع مطالعاتی مناسبی در این خصوص به اشتراک بگذارید.

نظرات

  • وحید نصیری در ۱۴۰۵/۰۵/۲۸ ۰۹:۱۳
    Copilot به صورت پیش‌فرض روی گیت‌هاب فعال است و در همه‌جای آن دردسترس است (البته نیاز به تغییر IP برای کار با آن هست ...):


    از آن برای code review حرفه‌ای کدهای win forms استفاده کنید؛ به این صورت و با این پرامپت ویژه که در آن، قسمت «کد مورد بررسی»، همین پوشه یا فایل جاری خواهد بود. خروجی این روش از خواندن صدها کتاب مؤثرتر است:

    Code Review — Windows Forms .NET
    تو در نقش یک Senior .NET Developer و Code Reviewer باتجربه در Windows Forms عمل کن.
    کدی که در ادامه ارائه می‌کنم مربوط به یک یا چند Control / Component / Form / UserControl در Windows Forms و .NET است.
    هدف، انجام یک Code Review دقیق، عملی و مبتنی بر Best Practice است؛ نه صرفاً بازنویسی یا سلیقه‌ای‌کردن کد.

    اهداف Review
    کد را از جنبه‌های زیر بررسی کن:
    1. Correctness
    بررسی کن که آیا کد از نظر منطقی و رفتاری صحیح است یا خیر.
    به‌خصوص موارد زیر را بررسی کن:
    • خطاهای منطقی
    • NullReference و سایر Exceptionهای محتمل
    • Edge Caseها
    • رفتار نادرست Eventها
    • ترتیب اجرای Eventها
    • مشکلات Initialization و Disposal
    • مشکلات مربوط به Handle و Control Lifecycle
    • Race Condition یا رفتارهای غیرقابل پیش‌بینی در صورت وجود Threading
    • مشکلات مربوط به Data Binding
    • رفتار نادرست هنگام Dispose شدن Control/Form

    2. Windows Forms Specific Issues
    به‌طور خاص بررسی کن:
    • Lifecycle مربوط به Form / Control / UserControl
    • استفاده صحیح از OnLoad, OnHandleCreated, OnHandleDestroyed, OnCreateControl, OnPaint و سایر Overrideها
    • استفاده صحیح از Eventها
    • احتمال Memory Leak ناشی از Event Subscription
    • IDisposable و Dispose
    • Componentها و IContainer
    • ISupportInitialize
    • Control.BeginInvoke / Invoke
    • Thread Affinity
    • UI Thread
    • Custom Painting
    • Invalidate, Refresh, Update
    • Double Buffering
    • Flickering
    • Layout و SuspendLayout / ResumeLayout
    • Anchor و Dock
    • DPI Scaling
    • High DPI / Per-Monitor DPI
    • Font و اندازه کنترل‌ها
    • RTL و Localization در صورت مرتبط بودن
    • Keyboard و Mouse Events
    • Accessibility در صورت مرتبط بودن
    • Design-Time Support
    • رفتار Control در Visual Studio Designer
    • Propertyها و Eventهایی که باید در Designer قابل استفاده باشند
    • DesignerSerializationVisibility
    • [Browsable], [Category], [Description], [DefaultValue] و Attributeهای مشابه در صورت نیاز

    3. Resource Management
    بررسی کن که آیا منابع به‌درستی مدیریت می‌شوند:
    • IDisposable
    • Dispose
    • Timer
    • Graphics
    • Pen
    • Brush
    • Font
    • Image
    • Bitmap
    • Streamها
    • Handleهای native
    • Event Subscriptionها
    مشخص کن کدام Resource واقعاً نیاز به Dispose دارد و از پیشنهاد Dispose غیرضروری خودداری کن.

    4. Performance
    مواردی که می‌توانند باعث افت Performance شوند را بررسی کن، از جمله:
    • ایجاد Objectهای غیرضروری
    • Allocationهای مکرر
    • عملیات سنگین در UI Thread
    • Painting غیرضروری
    • Layoutهای مکرر
    • Eventهای پرتکرار
    • Timerها
    • LINQ یا Reflection غیرضروری در مسیرهای حساس
    • ایجاد مکرر Bitmap/Image/Font/Brush/Pen
    • عملیات‌هایی که باعث UI Freeze می‌شوند
    فقط مواردی را مطرح کن که اثر واقعی یا بالقوه قابل‌توجه دارند و از Micro-Optimization بی‌دلیل خودداری کن.

    5. Threading و Async
    اگر کد دارای Threading یا Async است، بررسی کن:
    • UI Thread Affinity
    • دسترسی به Control از Thread اشتباه
    • استفاده صحیح از Invoke / BeginInvoke
    • async/await
    • احتمال Deadlock
    • .Result / .Wait()
    • Cancellation
    • Exception Handling در Async Code
    • Lifecycle هنگام Dispose شدن Control در حالی که عملیات Async هنوز در حال اجراست

    6. API Design
    API عمومی Control یا Component را بررسی کن:
    • نام‌گذاری
    • سطح دسترسی (public, protected, internal, private)
    • Propertyها
    • Eventها
    • Methodها
    • Constructorها
    • پارامترها
    • Immutability در صورت امکان
    • Encapsulation
    • امکان سوءاستفاده از API
    • سازگاری با Conventionهای .NET
    اگر Property یا Method عمومی وجود دارد که بهتر است Public نباشد، مشخص کن.

    7. Maintainability
    بررسی کن:
    • خوانایی
    • پیچیدگی
    • تکرار کد
    • Separation of Concerns
    • وابستگی‌های غیرضروری
    • Magic Number / Magic String
    • نام‌گذاری
    • متدهای بیش از حد بزرگ
    • مسئولیت‌های متعدد یک Class
    • قابلیت تست‌پذیری

    8. Exception Handling
    بررسی کن:
    • Catchهای غیرضروری
    • Catch کردن Exception بدون دلیل
    • Swallow کردن Exception
    • Exception Handling در Event Handlerها
    • از دست رفتن Stack Trace
    • پیام‌های خطای نامناسب
    • Exceptionهایی که بهتر است به Caller منتقل شوند

    9. Security
    در صورت مرتبط بودن، مواردی مانند:
    • Input Validation
    • Unsafe Deserialization
    • Path Traversal
    • Command Execution
    • Injection
    • Credential Handling
    • اطلاعات حساس در Log
    • دسترسی ناامن به فایل‌ها یا منابع سیستم
    را بررسی کن.

    10. Compatibility
    در صورت مشخص بودن Target Framework، بررسی کن که کد با آن سازگار و منطقی باشد.
    اگر Framework یا Version مشخص نشده است، فرضیات خود را صریحاً بیان کن و از پیشنهاد APIهایی که ممکن است در Version موردنظر وجود نداشته باشند خودداری کن.

    نحوه انجام Review
    برای هر مشکل، این موارد را مشخص کن:
    • Severity
    • Critical
    • High
    • Medium
    • Low
    • Suggestion
    • Location
    • نام Class
    • نام Method/Property/Event
    • و در صورت امکان شماره خط
    • Problem توضیح دقیق مشکل.
    • Why it matters توضیح بده این مشکل چه پیامد عملی دارد.
    • Recommendation راهکار پیشنهادی را ارائه کن.
    • Code Example اگر اصلاح کد مفید است، نمونه کد اصلاح‌شده ارائه کن.

    قوانین مهم Review
    • کد را فقط به دلیل تفاوت Style بازنویسی نکن.
    • بین Bug واقعی، Potential Problem و Preference تفاوت قائل شو.
    • اگر چیزی صحیح است، صرفاً برای پیشنهاد تغییر آن را Problem معرفی نکن.
    • از Overengineering خودداری کن.
    • Design Pattern جدید فقط زمانی پیشنهاد بده که واقعاً مسئله‌ای را حل کند.
    • اگر Refactoring پیشنهادی پیچیدگی بیشتری ایجاد می‌کند، آن را پیشنهاد نده.
    • اگر بخشی از کد به دلیل Windows Forms Designer به شکل خاصی نوشته شده است، این موضوع را در نظر بگیر.
    • رفتار Designer را با Runtime Code اشتباه نگیر.
    • Dispose کردن Objectها را فقط زمانی پیشنهاد بده که مالکیت آن Object با Class مورد بررسی باشد.
    • در مورد Performance، ابتدا مشخص کن آیا مسئله واقعاً قابل توجه است یا صرفاً Micro-Optimization است.
    • اگر مطمئن نیستی یک مورد واقعاً Bug است، آن را به عنوان Potential Issue مطرح کن.
    • اگر کد مشکلی ندارد، صریحاً بگو که آن قسمت صحیح است.
    • از تغییرات غیرضروری و Cosmetic Refactoring خودداری کن.

    اولویت‌بندی
    در پایان Review، یک خلاصه با این ساختار ارائه کن:
    Critical / High Priority

    مواردی که بهتر است حتماً اصلاح شوند.
    Medium Priority

    مواردی که اصلاح آن‌ها توصیه می‌شود.
    Low Priority / Suggestions

    موارد اختیاری و بهبودهای کیفی.
    Things That Are Already Good

    نقاط قوت و تصمیمات درست موجود در کد.
    Recommended Refactoring Plan

    اگر Refactoring لازم است، آن را به ترتیب اولویت و به صورت مرحله‌ای پیشنهاد کن.

    مهم
    قبل از ارائه پیشنهادهای اصلاحی، ابتدا رفتار فعلی کد را درک کن.
    اگر برای قضاوت درباره یک مشکل به بخشی از کد که ارائه نشده نیاز داری، به جای حدس زدن، آن وابستگی را مشخص کن.
    اگر چند راه‌حل وجود دارد، آن‌ها را مقایسه کن و بهترین گزینه را با توجه به Windows Forms و Target Framework انتخاب کن.
    در نهایت یک Review ارائه بده که یک Developer بتواند مستقیماً بر اساس آن تصمیم بگیرد که کدام موارد واقعاً ارزش اصلاح دارند و کدام موارد بهتر است دست‌نخورده باقی بمانند.

    Code
    کد مورد بررسی:
    // CODE GOES HERE
    در صورت وجود، این اطلاعات نیز ارائه خواهد شد:
    • Target Framework:
    • .NET Version:
    • نوع پروژه:
    • هدف Control/Component:
    • نحوه استفاده از Control:
    • مشکلات یا Bugهای فعلی:
    • کدهای مرتبط:

    • هادی مزارعی در ۱۴۰۵/۰۵/۲۸ ۱۵:۵۲
      ضمن تشکر؛ آیا پیشنهاد می‌کنید که هدف از متدهای پیاده‌سازی شده در کنترل‌ها را توضیح بدم (به ازای هر کنترل)؟ یا اینکه Copilot از کد و نام متد متوجه هدف میشه؟ البته کامنت‌های فارسی زیادی جهت علت وجودی متدها و متغیرها نوشتم.
      • وحید نصیری در ۱۴۰۵/۰۵/۲۸ ۱۸:۲۶
        با زبان فارسی مشکلی ندارند (هم از لحاظ سؤال پرسیدن و همچنین پاسخ دادن). در اینجا نیازی به توضیح اضافه‌تری نیست.