<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های حسین نریمانی راد</title><link>https://virgool.ir/feed/@hossein.narimani.rad</link><description>برنامه نویس GIS | برنامه نویس Back-end</description><language>fa</language><pubDate>2026-11-10 16:34:48</pubDate><image><url>https://files.virgool.ir/upload/users/29569/avatar/6Mpc4p.jpg</url><title>حسین نریمانی راد</title><link>https://virgool.ir/@hossein.narimani.rad</link></image><item><title>الگوی طراحی استراتژی (Strategy deisgn pattern)</title><link>https://virgool.ir/@hossein.narimani.rad/الگوی-طراحی-استراتژی-strategy-deisgn-pattern-t76phttomp7i</link><description>بسم اللهسلاممشکل یادگیری #الگوهای_طراحی (design pattern) در قالب مثال‌هایی با کلاس‌های «Foo» و «Bar» یا کلاس‌های «Vehicle»، «Bus»، «Bicycle» و «Car»، اینه که بعدا توی مدل‌سازی‌ها، ذهن به سختی می‌تونه متناظر این مفاهیم رو توی کار پیدا کنه به خصوص این که همیشه مفاهیم به این شفافی نیستن و ذهن به تمرین‌های انتزاعی‌تری نیاز داره. به همین دلیل مثال‌هایی که آدم از روی تجربه باهاشون برخورد می‌کنه می‌تونن تمرین خوبی برای یادگیری بهتر این الگوها باشن.مساله چی بود؟لازم بود که نقطه/خط/چندضلعی رو به صورت عکسی رندر کنم (یعنی به عکس تبدیل کنم). برا این کار حداقل ۴ روش رندر وجود داشت که این‌جا مهم نیست اونا چی هستن. خب اولین چیزی که به ذهن ما می‌رسه اینه که بیاییم و یه enum برا روش‌های مختلف تعریف کنیم و بر اساس اون توی کد رندر رو انجام بدیم (شکل زیر):رندر کردن نقطه/خط/چندضلعی بر اساس روش رندرینگاین کد یه مجموعه نقطه/خط/چندضلعی رو در قالب feature می گرفت و یه عکس تولید می‌کرد. همه چی خوب بود. تا این که کندی سرعت اجرای این رندرینگ‌ها وقتی تعداد شکل‌های هندسی زیاد می‌شد اذیت کننده شد. برا همین مجبور شدیم یه روش رو امتحان کنیم و اون این بود که صفحه مانیتور رو به چندین تایل (Tile) با سایز ۲۵۶*۲۵۶ پیکلس تقسیم کردیم و رندرینگ هر تایل که تموم می شد به کاربر اونو نمایش می‌دادیم. هر چند که در مجموع ممکن بود رندر شدن کل تایل‌ها زمان بیش‌تری از رندرینگ یک‌باره تمام صفحه ببره ولی چون اولین تایل سریع‌تر نمایش داده می‌شد، کاربر احساس بهتری داشت که سیستم داره یه کاری انجام می‌ده. اما برای این روش تایل-مبنا هم ما مجبور شدیم مجدد همون switch بالا رو استفاده کنیم! پس تا این جا دو تا متد داریم که هر دو از یه switch استفاده کردن.مشکل کجاست؟فرض کنید غیر از روش‌های «رندرینگ یک‌باره تمام صفحه» و «رندرینگ تایل-مبنا» یه روش دیگه هم در آینده اضافه بشه اون وقت مجدد این switch‌رو باید استفاده کنیم. از طرفی اگه به خود روش‌های رندرینگ هم یه چیزی اضافه بشه (مثلا Approach5 اضافه بشه) اون وقت باید یادمون باشه کجاها روی اون enum ما switch گذاشتیم و همه switch ها رو اصلاح کنیم.الگوی استراتژی چطوری می‌تونه کد ما رو تمیز کنه؟همیشه وقتی برای انجام یه کاری چند روش (استراتژی) مستقل از هم وجود داره به یاد الگوی استراتژی بیفتید. این الگو، تصمیم‌گیری (کد switch) در مورد این که کدوم روش استفاده بشه رو به عهده یه کلاس به اسم Context می‌ذاره و سایر جاها همه از اون استفاده می‌کنن و این طوری از تکرار کد جلوگیری می‌کنه.تصمیم‌گیری روش رندرینگ در کلاس Context با توجه به تنظیمات لایه (ToRasterTechnique)حالا جاهای مختلف کد چطوری از این استفاده می‌کنن؟ (شکل زیر) همون طور که می‌بینید دیگه به اون switch نیازی نیست و در واقع تصمیم‌گیری روش رندرینگ اصلا وظیفه‌ای نیست که بخواد توی متدهای مختلف تکرار بشه بلکه به صورت متمرکز بر عهده کلاس کانتکس هست.حذف کد switch و استفاده از کلاس Context برای انتخاب استراتژی رندرینگجمع‌بندیوقتی با مساله‌ای روبرو هستید که چند روش مستقل از هم دیگه داره و قرار نیست این روش‌ها با هم ترکیب بشن، احتمالا الگوی استراتژی به کار میاد.وقتی کدهای switch که در مورد انتخاب روش دارن تصمیم‌گیری می کنن چند جا تکرار بشن احتمالا الگوی استراتژی به کار میاد.الگوی استراتژی با انتقال کد تصمیم‌گیری در مورد روش انتخابی از متدهای مختلف به یه کلاس واحد (Context)، به رعایت اصل Single Responsibility (SRP) برای اون متدها کمک می‌کنه.الگوی استراتژی باعث می شه با اضافه شدن روش جدید، فقط یه switch رو اصلاح کنید و لازم نباشه بگردید همه جا رو اصلاح کنید. این کار به رعایت اصل Open/Closed Principle (OCP) برای اون متدها کمک می‌کنه چون هم اون متدها تغییری نمی‌کنن و هم امکان اضافه شدن روش جدید هست. تنها جایی که تغییر می‌کنه کلاس Context هست که اونم وظیفه اصلیش همینه.علاوه بر همه مزایای بالا، با تعریف یه تابع واحد Render توی کلاس strategy باعث شد که همه این متدها از نظر ورودی یکسان‌سازی بشن. این کار باعث شد که یه سری تبدیلات دیگه توی این متدها انجام نشه و این جا هم به رعایت SRP برا خود این متدها کمک کرد در حالی که توی نسخه‌های قدیمی این قید وجود نداشت.با شکسته شدن کدها توی کلاس‌ها و فایل‌های کوچیک‌تر، شانس ایجاد conflict زمان merge شدن کدها هم کم‌تر می‌شه و به این ترتیب کار تیمی ساده‌تر می‌شه. </description><category>حسین نریمانی راد</category><author>حسین نریمانی راد</author><pubDate>Sat, 16 Aug 2025 11:03:54 +0330</pubDate></item><item><title>🌍کتابخانه متن‌باز و مکان‌محور «مکان‌نگار»</title><link>https://virgool.ir/@hossein.narimani.rad/کتابخانه-متن-باز-رایگان-gisای-مکان-نگار-ynrsrqlug1ee</link><description>بسم اللهاگه به حوزه نقشه و GIS علاقه داشته باشید احتمالا محصول‌های زیادی رو دیدید. «مکان‌نگار» یا «Maptor» هم یکی از اوناست اما با یه سری تفاوت‌ها:✔️مکان‌نگار چی هست؟📍یه کتابخانه مخصوص کار با نقشه و داده‌های مکانی (نقطه/خط/چندضلعی) هست که رو بستر دات‌نت ۸ و به زبان C# نوشته شده. اصطلاحا به این کتابخانه‌ها «مکان‌محور» یا «GIS»ای گفته می‌شه.📍یه کتابخانه یا «بستر نرم‌افزاری» متن‌باز هست که استفاده از اون تحت مجوز متن‌باز MIT هیچ محدودیتی نداره.📍توابع، کلاس‌ها و امکانات لازم برا خوندن فرمت‌های مکانی، اتصال به پایگاه داده، تبادل اطلاعات مکانی، تبدیل بین انواع قالب‌های مکانی مثل Shapefile, GeoJson, WKB, WKT, EsriJsonGeometry، تبدیل بین انواع سیستم‌های مختصاتی و سیستم‌های تصویر مثل UTM، کار با نقشه‌های گوگل و Bing، ترسیم نقطه/خط/چندضلعی، اندازه‌گیری فاصله و مساحت و طول و عرض جغرافیایی، نمایش و کار با نقشه، و انجام تحلیل‌های مکانی رو داره.📍یه کامپوننت نقشه داره برای پروژه‌های دسکتاپی که با تکنولوژی WPF آماده شده. برای پروژه‌های تحت وب هم اون‌قدر امکانات داره که شما رو تا حدی از سرورهای نقشه‌ای مثل geoserver، بی‌نیاز می‌کنه.❌مکان‌نگار چی نیست؟📍«مکان‌نگار» یه نرم‌افزار خاص نیست. یه کتابخانه هست که با کمک اون می‌تونید نرم‌افزارهای مبتنی بر نقشه خودتون رو توسعه بدید. مثلا «نرم‌افزار نقشه‌یار»، یکی از محصول‌هایی هست که رو بستر «مکان‌نگار» توسعه داده شده.🌱از کجا شروع شد؟سال ۹۱ بعد از دوره ارشد و قبل از سربازی، ۲-۳ ماه یه شرکت مشغول بودم که نمایندگی یه محصول GISای ترکیه‌ای رو داشت. اون زمان با تمام وجود حس کردم که وابستگی نرم‌افزاری به یه محصول خارجی چقدر می‌تونه دیگران رو نسبت به کشور ما تو موضع قدرت قرار بده و با این روش در بهترین حالت برا همیشه شاگرد دیگران باقی می‌موندیم. برا همین به مستقل شدن تو این حوزه که با پروژه سربازی چند سال پیشم شروع شده بود، مطمئن‌تر شدم.🚀به کجا می‌خوایم بریم؟نه قراره با ESRI‌ مسابقه بدیم و نه با هیچ محصول دیگه‌ای مقایسه بشیم. فقط قراره اگه هر جای کشور نیاز به محصول GISای بود بتونیم راه‌حل بدیم. روی پای خودمون بایستیم. دستمون تو جیب خودمون باشه. اجازه‌مون هم دست دیگران نباشه. حتی بتونیم راه‌حل‌ها رو توی فضای بین‌المللی هم ارائه کنیم. گیر مجوز استفاده فلان شرکت خارجی نباشیم. بابت استفاده از یه محصول قفل شکسته سرمون پایین نباشه. از تجربیات بقیه استفاده کنیم و تجربیات خودمون رو هم اشتراک بذاریم.از اینا که بیش‌تر حواشی هستن بگذریم، لذت فهمیدن، تجربه‌کردن و دیدن نتیجه عملی تئوری‌ها با پیاده‌سازی الگوریتم‌ها و داده‌ساختارها و دست و پنجه نرم‌کردن با معماری‌ها و اصول مهندسی نرم‌افزار اون‌قدر لذت داره که نشه به این سادگی از این مسیر گذشت. بنابر این، اصلا جای خاصی قرار نیست بریم. فقط از مسیر می‌خوایم لذت ببریم :) در کنارش گره‌هایی هم بدست ما باز می‌شه. ان‌شاالله.🎯چشم‌اندازایده‌ال ترین حالت برا یه توسعه دهنده متن‌باز اینه که بتونه مشارکت و سرمایه‌گذاری خوبی رو برا پروژه جذب کنه و مسیر توسعه اون رو سرعت بده. خوبی این مسیر اینه که آجر به آجر رو روی هم می‌ذاریم و هر بار که یه مساله حل می‌شه دیگه برا همیشه حل شده و بعدا صرفا در صورتی که لازم شد اون رو بهبود می‌دیم.🤝چطوری می‌تونیم همکاری کنیم؟✨ اگه برنامه‌نویس و علاقه‌مند به برنامه‌نویسی GIS هستید: می‌تونید کدها رو از گیت‌هاب بگیرید، بخونید، کامنت‌بذارید و تغییرات خودتون رو pull request بزنید. برا آموزش می‌تونید صفحه Maptor رو توی لینکداین دنبال کنید. در آینده نزدیک کم کم آموزش‌های بیش‌تری رو آماده می‌کنم.✨ اگه تیم برنامه‌نویسی بخش دولتی یا خصوصی هستید: اگه می‌خواید نرم‌افزار خودتون رو توسعه بدید می‌تونید از این بستر استفاده کنید، و امتیاز نهایی محصولی که توسعه می‌دید هم برا خودتون هست. اگه نیاز به مشاوره، آموزش یا پشتیبانی هم داشتید می‌تونید با من تماس بگیرید.✨ اگه مدیر بخش دولتی یا خصوصی هستید: اگه دنبال نرم‌افزار GISای هستید اما تیم برنامه‌نویسی ندارید می‌تونید اون رو سفارش بدید که بر پایه این کتابخانه برا شما توسعه داده بشه. مزیت استفاده از مکان‌نگار اینه که به عنوان سرمایه‌گذار، تو امتیاز نهایی نرم‌افزاری که تولید بشه شما شریک می‌شید. سورس کد و تمام نیازمندی‌های نرم‌افزاری هم به شما تحویل داده می‌شه و هر زمان تیم توسعه تشکیل بدید این امکان هست که خودتون توسعه نرم‌افزار رو ادامه بدید.✨ اگه دانشجو هستید: از مکان‌نگار برا نمایش خروجی‌های مقاله، پایان‌نامه ارشد یا رساله دکترا می‌تونید استفاده کنید.✨ پروژه‌های شخصی: برا پروژه‌های شخصی مثل پروژه‌های سربازی که به نمایش نقشه نیاز دارن، هم می‌تونید از مکان‌نگار استفاده کنید. با توجه به بومی بودن اون معمولا گزینه جذابی برای ارائه پروژه‌های سربازی هست که امکانات خودتون رو روش بالا بیارید.💬از مشارکت شما استقبال می‌کنمهمین جا هم می‌تونید من رو از نظر خودتون مطلع کنید. اگه پیشنهادی دارید یا جایی برای شما مبهمه نظر بذارید.ممنون از شما📌 لینک‌ها🔗آدرس ریپازیتوری گیت‌هابباقی لینک‌ها رو تو کامنت گذاشتم</description><category>حسین نریمانی راد</category><author>حسین نریمانی راد</author><pubDate>Fri, 01 Aug 2025 18:37:16 +0330</pubDate></item></channel></rss>