Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
Software Philosophy
Photo
سفر قهرمانی #C از روزی که به دنیا آمد!

این قهرمان ما از سال ۲۰۰۲ سفر خودش را همراه با Visual Studio 2002 شروع کرد و تا امروز (۲۰۲۳) حدود ۱۱ بار آپدیت‌های جدیدی را ارائه داده است.
در اوایل کار زبانی شبیه به Java بود و صرفا نسبت به زبان‌های سطح پایین تنها چیزی که اضافه داشت بحث شی‌گرایی بود، اما در ادامه وارد دوره‌های مختلفی شد که نگاهی به این مسیر خواهیم کرد.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر نخستین: تبدیل شدن به یک زبان قابل قبول
C# 1.0, C# 1.2, C# 2.0

در این عصر زبانی را مشاهده می‌کنیم که تقریبا مثل بقیه زبان‌های C-Base است و تفاوت چندانی با آن‌ها ندارد. می‌شود گفت اینجا کار کردن با انواع داده‌ها نسبت به بقیه زبان‌ها آسون‌تر است.
با قابلیت‌های شی‌گرایی شروع کرده و در ادامه به خاطر چالش‌های نشت حافظه و ... ویژگی‌های دیگری را در ورژن‌های بعدی ارائه داد.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️


🔹عصر دوم: اضافه شدن امکانات منحصر بفرد
C# 3.0, C# 4.0, C# 5.0

حدود سال ۲۰۰۷ قهرمان ما تصمیم گرفت امکانات منحصر بفردی را ارائه دهد تا این زبان را از بقیه هم ردیف‌های خود متمایز کند.
این امکانات همراه با NET Framework version 3.5 و Visual Studio 2008 وارد بازار شدند.
امکانات نام آشنایی از قبیل Lambda expression ها،Object and collection initializer ها و ... در این ورژن به سی‌شارپ اضافه شدند.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر سوم: باز نویسی کامل کامپایلر با سی‌شارپ (Roslyn)
C# 6.0

سال ۲۰۱۵ سی‌شارپ ۶ همراه با Visual Studio 2015 وارد بازار شد. اینبار سی‌شارپ شروع به اعمال تغییراتی کرد که عمدتا با ذهنیت کد تمیز و ساده همراه بود. از جمله تغییرات مهم هم بازنویسی کامل کامپایلر با خود زبان سی‌شارپ بود.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر چهارم: رضایت طرفداران کد تمیز و ساده
C# 7.0, C# 7.1, C# 7.2, C# 7.3

استارت تغییرات کوچک نسخه ۶ سی‌شارپ خورده شده بود ولی از نسخه ۷ به بعد مایکروسافت تمرکز بیشتری روی این امر داشت و تغییرات همگی دارای یک هدف مهم بودند: آسان و تمیز بودن کدها!
امکاناتی از قبیل tuple,out,ref و ... از جمله این تغییرات بودند.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر پنجم:‌ دنیای Cross-Platform، خداحافظی با NullReferenceException و تلاش برای شبیه شدن به زبان‌های اسکریپت نویسی

C# 8.0, C# 9, C# 10, C# 11

با روی کار آمدن NET Core. مایکروسافت امکاناتی را ارائه داده بود که مبتنی بر توانایی‌های CLR بود.
سال‌ها برنامه نویس‌ها با خطای NullReferenceException دست و پنجه نرم می‌کردند ولی حالا با استفاده درست از قابلیت Nullable refrence type ها می‌شد تا حد قابل قبولی جلوی این اتفاق را گرفت.
در ادامه تغییرات به سمتی رفته که زبان سی‌شارپ را شبیه به یک زبان اسکریپت نویسی کرده بود. حالا می‌شد بدون تعریف کلاس و متد خاصی دستورات ساده را اجرا کرد. همچنین قابلیت‌هایی که در pattern maching به سی‌شارپ اضافه شد باعث ساده‌تر و قابل فهم‌تر شدن سی‌شارپ می‌شد.

🔗 مشاهده جزئیات ورژن های مختلف سی‌شارپ
🔗 مطالعه مقاله در ویرگول

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍289🔥3🤩2
ولیدیشنی آسان و بدون درد!

در NET. ابزارهایی برای Validation پراپرتی‌های یک کلاس وجود دارد که نام آشناترین آن‌ها DataAnnotation است.

اما یکی از قوی‌ترین و آسان‌ترین Library ها، ابزار FluentValidation است.

دلیل آسان بودن کار کردن با این کتابخانه strongly-typed بودن آن است.

مثال:
RuleFor(person => person.UserName)
.NotEmpty()
.MinimumLength(3);

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید. با مطالعه کامل این مقاله می‌توانید از این ابزار در هر جایی استفاده کنید. یکی از کاربردی ترین امکانات آن استفاده در EF Core و Razor Page ها است. همچنین می‌توانید Validation های Customize شده توسط خودتان را نیز تعریف و اعمال کنید.

🔗 داکیومنت FluentValidation

🔗 سورس کد پروژه FluentValidation

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍157🔥3👏2
Forwarded from Functionland Announcements (Kel ~ Does Not PM first)
Join us and learn how Blazor MAUI can help you maximize code sharing across Web, Android, iOS, Windows, macOS and more.

This is a must-see event for anyone who knows C#! Come see how Blazor worked its magic for Functionland’s FxFiles app!📲

Gain valuable insights on FxFiles development from our very own CEO Keyvan M.Sadeghi and software architecture Mehran Davoudi.💫

bit.ly/BlazorFxFiles

@functionland
🔥7👍4🎉21
یک تیر و دو نشان با Blazor United

همانطور که می‌دانید در ASP.NET Core دو روش برای بیلد web UI وجود دارد:
۱. روش Server Side Rendering (SSR): در این روش HTML مورد نیاز برای نمایش سمت سرور ساخته می‌شود و همه چیز آماده نمایش سمت کلاینت می‌رسد و کلاینت فقط و فقط باید HTML رندر شده را نمایش دهد. با توجه به اینکه همه کارهای سخت مثل گرفتن دیتا و نحوه نمایش سمت سرور مشخص شده است، وظایف سمت کلاینت خیلی سبکتر است. بنابراین از مزایای این روش سرعت لود بالا و سئو بهتر است.
۲. روش Client Side Rendering (CSR): در این روش اتفاقاتی که روی UI رخ می‌دهد، سمت کلاینت هندل می‌شود. این در حالیست که در روش SSR هر تغییر و اتفاق روی UI باید سمت سرور فرستاده شود تا نتیجه مشخص گردد. به همین دلیل سرور رندرینگ برای پروژه‌هایی که تعامل زیادی با کاربر دارد مناسب نیست و CSR پیشنهاد می‌شود.

در بیشتر پروژه‌ها ترکیبی از این دو روش لازم است، یعنی برخی صفحات تعامل کمتری با کاربر دارند ولی سرعت لود بالایی را می‌طلبند و اینکه لازم است بتوانند به راحتی ایندکس شوند، مانند صفحات home و درباره ما و مانند آن. از طرف دیگر برخی صفحات ارتباط بیشتری با کاربر دارند و پاسخگو بودن در هر لحظه حائز اهمیت است.
اینجاست که Blazor United به کار می‌آید. Blazor United به شما این امکان ر می‌دهد که با معماری واحد از هر کدام از روش های لازم (SSR or CSR)، برای رندرینگ صفحات خود استفاده کنید. حتی به شما این امکان را می‌دهد که از هر دو روش در یک صفحه استفاده کنید.

در این رابطه می‌توانید صحبت‌های Steve Sanderson را بشنوید:

https://youtu.be/48G_CEGXZZM

⁉️ سوالات و نکات خود را در قسمت کامنت با ما در میان بگذارید.

#مریم_داودی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_______
👍14🔥43
بهبود‌های NET7. فقط از جنس Performance نیست!

یکی از مهم ترین تغییرات در NET7. در بحث Network مشاهده می‌شود که می‌توان آن‌ها را به چهار دسته زیر تقسیم بندی کرد:

۱- بهبود‌های مربوط به HTTP
۲- معرفی API جدید QUIC
۳- امنیت شبکه
۴- مسائل مربوط به WebSocket ها


🔽 بررسی موارد مربوط به HTTP
🔹یکی از تاثیر گذارترین تغییرات مدیریت connection هایی هست که attempt failures در آن‌ها رخ داده است.
🔹دومین مورد Thread safe شدن HttpHeader ها است.
🔹مورد بعدی قابل درک‌تر شدن خطاهای HTTP/2 و HTTP/3:
در لایه های پایینی ممکن است خطاهای خاصی رخ دهد. مثلا امکان دارد در HTTP2 خطای REFUSED_STREAM (0x7) رخ دهد یا در HTTP3 با خطای H3_EXCESSIVE_LOAD (0x0107) مواجه شوید.

اینها همگی خطاهایی هستند که برای کاربر در لایه‌های بالاتر کد معنای خاصی ندارند.
در عوض در NET7. ما می‌توانیم با استفاده از HttpProtocolException که در inner exception کلاس HttpRequestException است خطاهای مربوطه را catch کنیم:

try
{
using var response = await httpClient.GetStringAsync(url);
}
catch (HttpRequestException ex) when (ex.InnerException is HttpProtocolException pex)
{
Console.WriteLine("HTTP error code: " + pex.ErrorCode)
}

زمانی هم که با ریسپانس‌های HttpContent کار می‌کنیم، مستقیم می‌توانیم از HttpProtocolException استفاده کنیم:

using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
using var responseStream = await response.Content.ReadAsStreamAsync();
try
{
await responseStream.ReadAsync(buffer);
}
catch (HttpProtocolException pex)
{
Console.WriteLine("HTTP error code: " + pex.ErrorCode)
}

🔽 توضیح مختصری در مورد QUIC
پروتکل QUIC یا Quick UDP Internet Connections یکی از پروتکل‌های لایه transport شبکه است که قبلا مایکروسافت پیاده سازی خود را در قالب MsQuic ارائه داده بود.
بعدها در NET5. در کدهای خود هم از این امکان استفاده می‌کرد.
در NET7. هم امکان استفاده از این قابلیت با استفاده از System.Net.Quic امکان پذیر شده است.

نحوه کارکرد آن نیز در استفاده از سه کلاس زیر خلاصه می‌شود:

QuicListener 
QuicConnection
QuicStream

در این بین تمرکز اصلی ما بر روی مورد اول یعنی (بهبود‌های مربوط به HTTP) بود و توضیح کوتاهی نیز در مورد مورد QUIC ارائه دادیم.

برای مشاهده توضیحات کامل می‌توانید از 🔗 این لینک استفاده کنید.

🔗لینک ویرگول این پست.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍186🔥3👏2
آشنایی با clip-path در CSS

با کمک پراپرتی clip-path در CSS می‌توانید سطحی از المنت را مشخص کنید که در آن سطح نمایش داده شود و خارج آن سطح دیده نشود.
معمولا این کار را با عکس‌ها انجام می‌دهند ولی محدودیتی وجود ندارد و شما می‌توانید در المنت‌های حاوی متن هم از این پراپرتی استفاده کنید.
سطحی که با استفاده از این پراپرتی مشخص می‌شود می‌تواند شکلی مشخص مثل دایره یا بیضی یا ... باشد و یا یه شکلی دلخواه مانند آرم بتمن یا هر چیز دیگری!
برای استفاده راحت‌تر از این پراپرتی،‌ فایرفاکس امکانی را در devTools قرار داده است که inspect هر المنتی را می‌توانید ببینید.

نکته دیگری که خیلی توجه من را جلب کرد این مطلب بود که با کمک این پراپرتی می‌شود خیلی راحت‌تر و زیباتر Transition را اعمال کرد.

اگه می‌خواهید بیشتر در مورد این پراپرتی بدانید،‌ بلاگ زیر را از دست ندهید.

https://ishadeed.com/article/clip-path/

⁉️ سوالات و نکات خود را در قسمت کامنت با ما در میان بگذارید.

#مریم_داودی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_______
👍113🔥1🥰1😢1
الگوی "try-catch-finally" به زبان ساده

الگوی "try-catch-finally" در سی‌شارپ یک ساختار برنامه‌نویسی است که برای مدیریت خطاها استفاده می‌شود. این دستور در سی‌شارپ نسخه 1.0 معرفی شد و راهی برای مدیریت و بازیابی خطاهایی که ممکن است در حین اجرای یک برنامه رخ‌ دهد ارائه می‌دهد.

فلسفه‌ی پشت الگوی «try-catch-finally» این است که برنامه‌نویسان را قادر می‌سازد تا کدی بنویسند که بتواند خطاهای غیرمنتظره را به شیوه‌ای زیبا و کنترل شده مدیریت کند.

با گرفتن و رسیدگی به خطاها، یک برنامه می‌تواند از خراب شدن جلوگیری کند و بازخورد مفیدی را در مورد اشتباه پیش‌آمده در اختیار کاربر قرار دهد.

دستور "finally" برای انجام عملیات پاکسازی، مانند بستن فایل‌ها یا آزاد کردن منابع، مفید است، که باید بدون توجه به اینکه آیا خطایی وجود دارد یا خیر، انجام شود.

به طور کلی، الگوی "try-catch-finally" یک ابزار قدرتمند برای مدیریت خطاها در برنامه‌های سی‌شارپ است و بخشی ضروری از هر برنامه قوی و قابل اعتمادی است.

برای درک این دستور به زبان ساده می‌توانید از این لینک استفاده کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍51👏1
سرنخ‌های شرطی

در قسمت دوم چگونه کارآگاه کدهایمان باشیم، یاد می‌گیریم باتوجه به قابلیت‌هایی که ابزار Visual Studio به ما می‌دهد بتوانیم از سرنخ‌هایمان بهتر استفاده کنیم.

در این مقاله یاد ‌می‌گیریم که، زمانی که سرنخی را پیدا کردیم، آیا می‌خواهیم تا انتهای سرنخ را برسی کنیم یا برایمان همین اطلاعات که از این قسمت از سرنخ به دست‌آورده‌ایم کافی است؟ در واقع در این قسمت انواع Step ها را در زمان دیباگ کردن که به یک Breakpoint می‌رسیم را بررسی می‌کنیم.

برای این کار از ابزار View Result استفاده می‌کنیم تا بتوانیم در هر مرحله از برسی‌هایمان، نگاهی به مقادیری که قبلا داشته‌ایم هم داشته‌باشیم.

هر کارآگاهی روش مختص به خودش را دارد مثلا، یک نفر ترجیح می‌دهد که اگر یک سرنخ شرایط خاصی را داشت بررسی کند، یک نفر دیگر اگر آن سرنخ چند بار تکرار شود! این امکانات در محیط Visual Studio تعبیه شده که آن‌ها را با اسم Condition Breakpoint تعریف کرده‌اند.

همچنین ما به عنوان یک کارآگاه حرفه‌ای گاهی اوقات نیاز به کمک داریم و انتظار داریم کارآگاهی هم که به ما کمک می‌کند دقیقا در همان قسمت‌هایی که ما مشخص کرده‌ایم دنبال سرنخ باشد، این امکان در محیط توسعه ما وجود دارد و به اسم Export Breakpoint می‌شناسیمش و می‌توانیم آن را با دیگران به اشتراک بگذاریم. این قابلیت دقیقا مکان‌هایی که ما مشخص کرده‌ایم را برای Breakpoint هایمان در محیط توسعه شخص کمک‌دهنده نشان‌ می‌دهد.

برای خواندن قدم دوم می‌توانید از این لینک استفاده کنید.

قسمت اول را می‌توانید اینجا بخوانید.


⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
6👍3👏1
تسک‌های پس زمینه خود را به ما بسپارید!

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

مثلا هر شب ایمیل خاصی را به کاربران بخصوصی بفرستد. یا هر ساعت مجموع فاکتورها را محاسبه کرده و برای مدیر محصول sms کند و ...

برای پیاده سازی این سیستم راه‌های مختلفی مانند Hangfire و ... وجود دارد.

ولی در ASP.Net یکی از ساده‌ترین و در عین حال (به نظر من) ناشناخته‌ترین‌ها! خود سرویس پیشفرض IHostedService است.

می‌تونید از این لینک برای اطلاع از نحوه کار با این سرویس استفاده کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍17🔥61
چگونه در #C دو String را با یکدیگر مقایسه کنیم؟

به نظر سوال ساده‌ای است. اولین چیزی که به ذهن می‌رسد استفاده از == است.

این روش جواب می‌دهد ولی راه بهینه‌ای نیست. مخصوصا زمانی که به lower و upper تبدیل می‌کنید.

〰️〰️〰️〰️〰️
دو روش درست برای این کار وجود دارد.

استفاده از string.Compare

در اینجا اگر در مقایسه کردن، بزرگ و کوچک بودن حروف برای شما اهمیت دارد می‌توانید مقدار StringComparison.Ordinal را پاس دهید و اگر این موضوع اهمیت نداشته باشید می‌توانید StringComparison.OrdinalIgnoreCase را پاس دهید.

〰️〰️〰️〰️〰️

استفاده از String.Equal

در این متد هم می‌توانید از هر دو حالت Ordinal و OrdinalIgnoreCase برای مقایسه استفاده کنید.

〰️〰️〰️〰️〰️

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

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍134👎2🔥2👏1
برای نگهداری آخرین وضعیت در بلیزور چه باید کرد؟

فرض کنید در حال پر کردن فرم اطلاعاتی بزرگی هستید، و این عملیات برای شما ۳۰ دقیقه طول می‌کشد. پس از زدن دکمه ثبت با خطای Connection lost! روبرو می‌شوید. دکمه بک را می‌زنید و به صفحه قبل بر می‌گردید تا مجدد دکمه ثبت را بزنید. اما خبری از آن همه اطلاعاتی که ثبت کرده بودید نیست!
این تجربه‌ی دوست نداشتنی باعث می‌شود که دیگر به این سایت سر نزنید!

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

• آبجکت مدل HTML که همان UI صفحه است
• فیلدها و پراپرتی‌های مورد استفاده
• وضعیت سرویس‌های رجیستر شده

🔗 در این مقاله سه راه حل برای مدیریت state در بلیزور ارائه شده است و نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

🔗 لینک مقاله در ویرگول

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍9🔥92
۷ موردی که هر برنامه‌نویسی ملزم به رعایت کردن آن است!

🎯 هدف این مقاله افزایش کارآیی و تاثیر Developer ها است. در این مقاله ۷ مورد برای رسیدن به این هدف ذکر شده:

۱- انتخاب فناوری مناسب
در هنگام شروع پروژه، مهم‌ترین تصمیم، انتخاب زبان برنامه‌نویسی، دیتابیس، کتابخانه‌های مورد نیاز و ... مناسب است. یکی از روش‌های انتخاب این موارد، انتخاب تکنولوژی‌ای‌ است که قبلا با آن کار کرده‌اید. مثلا اگر شما یک NET Developer. باشید یا تیم شما یک تیم NET. ای باشد، به نظر منطقی‌تر می‌رسد که پروژه جدید اندرویدی خود را با تکنولوژی مربوطه در NET. پیاده سازی کنید (MAUI). اما این روش ممکن است همیشه جواب ندهد و در بعضی سناریوها نیاز داشته باشید تا از تکنولوژی‌های دیگری نیز استفاده کنید.

۲- انتخاب ابزار مناسب
یک برنامه نویس بعد از انتخاب تنکولوژی برای راحتی در ادامه کار و مدیریت بهتر کار باید ابزارهای مناسبی را انتخاب کند تا به او در پروسه تولید محصول کمک کند. برای مثل اگر شما قصد پیاده سازی سایت با تکنولوژی Blazor را دارید، بهترین ترکیب استفاده از Visual Studio برای برنامه‌نویسی و استفاده از Azure Devops برای بیلد و ریلیز و مدیریت تسک‌ها و تست‌های خودکار است.

۳- به حداقل رساندن کدها
حجم کم کد به خوانایی، توسعه پذیری، تست‌نویسی و ... کمک به سزایی می‌کند. برای رسیدن به این هدف می‌توان از اصل رایج DRY یا همان Don’t Repeat Yourself تبعیت کرد.


۴- تعریف و رعایت کردن Convention ها
در پروژه‌ها بهتر است همیشه همه برنامه‌نویس‌های تیم از مجموعه‌ای از قوانین از پیش تعریف شده تبعیت کنند تا چند‌دستگی در کدها پیش نیاید. از نحوه تعریف متغییرها یا در حالت کلی نام گذاری (Naming) گرفته تا مدلی که برای داکیومنت کردن و ... قرار است استفاده شود.
همچنین توصیه می‌شود که برای فرمت دهی به کدها نیز یک سری هماهنگی‌ها انجام شود. مثلا یک برنامه‌نویس با Prettier کار نکند و برنامه‌نویس دیگر با Code formatter دیگر.


۵- تست‌نویسی
یکی دیگر از مهم‌ترین موارد که هر برنامه‌نویس و تیمی باید آن را رعایت کند، نوشتن تست‌های خودکار است. در مورد فواید، اهمیت، انواع تست و ... به کرات صحبت شده و مطالب زیادی در اینترنت موجود است که توصیه می‌شود اگر با آن‌ها آشنا نیستید حتما سراغشان بروید.

۶- بازبینی مجدد کد (Code review)
باگ و اشتباهات عضو جدایی ناپذیر در یک محصول نرم‌افزاریست. پس بهتر است قبل از نهایی سازی کدهای خود، از هم تیمی خود بخواهید تا Pull request شما را Review کند تا احتمال وجود خطا و اشتباهات با دیدن مجدد کد توسط فرد دیگر کاهش یابد. این پروسه شاید در دید اول زمان‌بر باشد ولی در واقع باعث صرفه جویی در زمانی می‌شود که قرار است شما دنبال رفع باگ‌های ناشی از این اشتباهات باشید.

۷- داکیومنت‌نویسی
یکی دیگر از نکاتی که کمتر به آن اهمیت داده می‌شود ولی برنامه‌نویس باید رعایت کند، Documentation است.
داکیومنت قوی کمک می‌کند تا تیم دقیق‌تر بداند که برای پیشرفت محصول به چه چیزی نیاز دارد.
همچنین برای توسعه پروژه‌ای که برای مثال یک سال از برنامه‌نویسی آن گذشته است و حال شما قصد دارید تا فیچری به آن اضافه کنید این داکیومنت کردن است که به شما کمک می‌کند تا این کار را انجام دهید. حتی ممکن است شما بعد از یک سال ندانید چگونه می‌توانید پروژه را ران کنید!
اگر هم یک عضو جدید به تیم اضافه شود این داکیومنت‌ها هستند که باعث صرفه جویی در زمان Onboarding فرد جدید می‌شوند و همچنین این اطمینان را می‌دهند که هیچ نکته ای برای Onboarding عضو جدید از قلم نمی‌افتد.

نسخه کامل این مقاله را می‌توانید در 🔗 اینجا بخوانید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#حامد_حاجیلو (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍20🔥42
استفاده از any و unknown در TypeScript

هیچوقت در TypeScript از نوع any استفاده نکنید، اما چرا؟
چون استفاده از any به این معنی است که: «اصلا برایم مهم نیست که متغیر چه تایپی دارد» و خوب اولین دلیلی که به خاطر آن از TypeScript استفاده می‌کنیم خاصیت Type-base بودن است.

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

از ورژن 3 به بالای TypeScript، داده‌ای اضافه شده به اسم unknown
تایپ. unknown مثل تایپ any، هر مقداری را قبول می‌کند، با این تفاوت که وقتی از نوع unknown استفاده می‌کنید، تایپ اسکریپت یک Type check انجام می‌دهد و با این کار شما را مجبور می‌کند قبل از استفاده از متغیر یک چکینگ داشته باشید.
درواقع برخلاف any که می‌گوید «برای من مهم نیست که متغیر چه تایپی دارد»، unkonwn می‌گوید «مهم است تایپ متغیر چیست ولی الان تایپ را نمی‌دانم و در ادامه بررسی خواهد شد.»

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

⁉️ سوالات و نکات خود را در قسمت کامنت با ما در میان بگذارید.

#مریم_داودی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_______
👍203🔥3
Forwarded from Software Philosophy
یکی از مهمترین کارهایی که یک معمار نرم‌افزار انجام می‌‌دهد تشخیص و خلق مفهومی به نام «فضا» است. اگر در نرم‌افزاری فضاها به درستی ساخته نشوند، برنامه نویسان دچار سردرگمی می‌شوند و عمدتا کدهای تکراری خواهند نوشت. ساخت فضاهای درست توسط معمار نرم‌افزار احتمال نوشته شدن کدهای تکراری یا اضافی را کم می‌کند.

در لینک زیر مفهوم فضا در معماری نرم‌افزار توضیح داده شده
http://mehrandvd.me/2015/09/16/software-architect-its-all-about-spaces/
👍5🔥52
پرفورمنس بهتر با @Key!

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

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

دستور @key به Blazor اجازه می دهد تا از یک کلید خاص برای مقایسه عناصر به جای ایندکس استفاده کند Blazor آیتم‌های موجود را با موارد جدید با استفاده از مقدار کلید مقایسه می کند. به این ترتیب اضافه‌ها/اصلاحات/حذف‌ها را بهتر تشخیص می‌دهد.

@foreach (var item in items)
{
<li @key="item.Id">@item</li>
}


با استفاده از @key اگر یک نمونه از مجموعه حذف شود، فقط همان نمونه از رابط کاربری حذف می‌شود و موارد دیگر بدون تغییر باقی می‌ماند.
اگر ورودی‌های مجموعه دوباره مرتب شوند، نمونه‌های مربوطه در رابط کاربری حفظ و مرتب می‌شوند.

چه زمانی از @key استفاده نکنیم؟

به طور معمول، استفاده از @key درون یک لیست وقتی مقدار مناسب برای تعریف @key وجود دارد، منطقی است. (به عنوان مثال در یک بلاک foreach)
هنگام رندر کردن با @key هزینه عملکردی وجود دارد. هزینه عملکرد زیاد نیست، اما فقط در صورتی @key را مشخص کنید که حفظ عنصر یا جزء به نفع برنامه باشد.


برای مشاهده توضیحات کامل می‌توانید از 🔗 این لینک و 🔗 این لینک استفاده کنید.

🔗 لینک ویرگول این پست.

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_____
👍134🔥4
اعتیاد به ساخت نرم‌افزارهای جدید!

ما به عنوان مهندسین نرم‌افزار عادت کرده‌ایم که نرم‌افزار بسازیم، در حقیقت به آن معتاد شده‌ایم. به خاطر همین موضوع است که اغلب دوست نداریم به این فکر کنیم که تغییری که در نرم‌افزار می‌دهیم چطور باید در نسخه لایو اجرایی شود. خیلی وقت‌ها نرم‌افزار را به صورت بسیار عالی تغییر می‌دهیم، ولی برنامه‌ای برای اینکه این تغییر چطور باید در نسخه‌اجرایی اعمال شود نداریم.
یکی از دغدغه‌ اصلی یک مهندس نرم‌افزار خوب، تمرکز بر Software Migration است. هر قطعه کدی که توسط یک مهندس نرم‌افزار نوشته می‌شود باید با دید یک Change دیده شود که روی نسخه لایو اعمال شود، نه صرفا یک کد جدید که Create شده‌است.

http://mehrandvd.me/2015/09/06/be-a-developer-not-a-programmer/

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

کانال تلگرام:
@SoftwarePhilosophy

_____
👍7🔥32
فعال سازی Pre rendering در بلیزور

چرا باید در پروژه‌های بیلزور Pre rendering را انجام داد؟ بدون pre rendering دو مشکل در بلیزور سرور و کلاینت وجود دارد:

بلیزور کلاینت:
در این نسخه از بلیزور قبل از اینکه کاربر بتواند تعاملی با سایت داشته باشد همه‌ی content های سایت باید دانلود شود که این مورد زمان گیر است.

بلیزور سرور:
از آنجایی که ما به جاوا اسکریپت و SignalR نیاز داریم، در بهینه سازی وب سایت خود برای موتورهای جستجو مشکل خواهیم داشت. آنها اغلب یا جاوا اسکریپت را اجرا نمی‌کنند یا با WebSockets مشکل دارند.

در prerendering همه چیز رندر می‌شود و محتوای یک html استاتیک به سمت کلاینت فرستاده خواهد شد.

در نتیجه:
برای بلیزور کلاینت به این شکل خواهد بود که اطلاعات اولیه سایت به کاربر نمایش داده خواهد شد بدون اینکه نیاز باشد ابتدا مقدار زیادی دانلود انجام شود. همچنین مشکل سایت با موتورهای جستجو حل خواهد شد.

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.
🔗 لینک مقاله در ویرگول

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_____
🔥7👍62🎉1
تعریف مفهوم LINQ با مثال به ساده‌ترین حالت

سلام امروز می‌خواهیم در مورد LINQ بیشتر باهم بخوانیم. LINQ که مخفف Language Integrated Query است، قابلیتی مهم و قدرتمند در C# است که به برنامه‌نویسان این امکان را می‌دهد تا به صورت ساده و خوانا، داده‌های مختلف را در دسترس داشته باشند.

با استفاده از LINQ، می‌توانید داده‌های موجود در انواع مختلفی مانند آرایه‌ها، لیست‌ها، کوئری‌های SQL و ... را به صورت مستقیم و با نحوی ساده و خوانا استفاده کنید.

کاربردهای اصلی LINQ عبارتند از:
۱.جستجوی داده‌ها
۲.فیلتر کردن داده‌ها
۳.ترتیب‌بندی داده‌ها
۴.ترکیب داده‌ها
۵.پیمایش داده‌ها

پس در واقع با استفاده از LINQ می‌توانید داده‌های موجود را براساس شرایط و معیارهای مختلفی مرتب کنید و نتایج را به شکلی سفارشی و بهینه نمایش دهید.

در مقاله زیر می‌توانید مثال‌های مختلفی از LINQ را ببنید، که سعی کردم آن‌ها را با ساده‌ترین حالت ممکن توضیح بدهم :
• Filtering
• Projection
• Ordering
• Grouping
• Aggregation
• Joining
• Distinct
• Any and All
• Take and Skip

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_________
👍17🔥43🎉1
جایگاه توسعه‌دهندگان نرم‌افزار در موفقیت یا شکست سیستم‌ها

یکی از مباحثی که همیشه در تشکیل تیم‌های نرم‌افزاری مطرح است، انتخاب زبان برنامه‌نویسی و یا تکنولوژی‌های مورد استفاده است. مقایسه محصولات موفق و ناموفق نشان می‌دهد هیچکدام از آنها صرفا با یک تکنولوژی و یا یک زبان خاص نوشته نشده‌اند.

برای مثال سیستم‌های موفق زیادی وجود دارند که با Java و یا C# نوشته شده‌اند. همچنین سیستم‌های بی‌کیفیت زیادی نیز وجود دارد که با Java و یا C# نوشته شده‌اند. این حقیقت نشان می‌دهد دلیل موفقیت یا شکست سیستم‌ها نمی‌تواند زبان برنامه‌نویسی باشد.

مقاله زیر توضیح می‌دهد که چطور طرز فکر برنامه‌نویس‌ها موفقیت و یا شکست یک سیستم را رقم می‌زند.

http://mehrandvd.me/2015/10/15/software-quality-comes-from-people-not-languages/

_____

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

کانال تلگرام:
@SoftwarePhilosophy

_____
👍102🔥2
چگونه تغییرات فایل‌ها را مانیتور کنیم؟

اگر بخواهیم از طریق اپلیکیشنی در دات‌نت‌ تغییرات فایل‌ها و یا فولدرها را مانیتور کنیم می‌توانیم از کلاسی به اسم FileSystemWatcher استفاده کنیم.

به طور کلی هر تغییری که شامل Creation، Deletion و یا Renaming فایل و فولدرها شود را می‌شود از طریق این کلاس مانیتور کرد.
با این کلاس می‌توانیم تغییرات فقط یک فایل خاص، و یا یک فولدر (دایرکتوری) به همراه تمام فایل‌ها و ساب دایرکتوری‌های آن فایل یا فولدر را پیگیری کنیم.

برای مثال اگر دایرکتوری به نام A داشته باشیم و داخل آن دو فایل B و C داشته باشیم، می‌توانیم به طور مجزا فقط تغییرات خود فایل B و C را نیز مانیتور کنیم، و یا به جای اینکار می‌توانیم دایرکتوری A را مانیتور کنیم. در این صورت هر تغییری که در دو فایل B و C رخ دهد قابل مانیتور کردن می‌شود.

علاوه بر این نکات، با استفاده از پراپرتی NotifyFilter این کلاس می‌توانیم تغییرات بیشتری به غیر از ایجاد شدن، حذف شدن و یا تغییر نام را پیگیری کنیم. مواردی مثل تغییر در Attributes ها، CreationTime و یا تغییراتی در سطح دسترسی و حتی تغییر سایز فایل یا فولدر و غیره ...

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

برای اینکه بدون افزایش سایز بافر دایرکتوری مورد نظر را مانیتور کنیم می‌توانیم از پراپرتی‌های این کلاس که در پایین معرفی می‌شود برای محدود کردن تغییراتی که باید توسط این کلاس مانیتور شود استفاده کنیم:

▪️ NotifyFilter
▪️ IncludeSubdirectories
▪️ Filter


🔗برای مطالعه بیشتر در مورد نحوه استفاده از این کلاس و مزایای آن می‌توانید از این لینک استفاده کنید.

___________

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#زیبا_سیفائی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

_________
👍145🎉2🔥1🤩1