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

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

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

لینک زیر توضیح می‌دهد که چگونه یک معماری بد باعث «رشد افزونگی کد» در نرم‌افزار می‌شود.

http://mehrandvd.me/2016/02/28/growing-redundancy-an-architectural-disease/

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

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

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

__________
👍123🔥2
حفظ state قبلی کامپوننت در Angular

در حین رفت آمد از یک کامپونتت به کامپونتت دیگر عدم ذخیره خروجی یا نتیجه کامپوننت باعث می‌شود با هر بار وارد شدن به آن کامپوننت کل کدهای جاوا اسکریپت کامپونتت مجدد اجرا شود و این روند به تدریج باعث کندی و عملکرد ضعیف سیستم می‌شو‌د.

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

برای حل این مشکل به جای از بین بردن نتیجه کامپوننت فعلی موقع جابه‌جایی در بین کامپوننت‌ها می‌توانیم نتیجه کامپوننت را  ذخیره کرده و دوباره از آن استفاده کنیم. می‌توانیم این کار را با استفاده از RouteReuseStrategies انجام دهیم. این راهی است که Angular برای بهبود عملکرد در حین جابه‌جایی بین کامپوننت‌ها ارائه می‌دهد و به ‌جای از بین بردن instance کامپوننت آن را ذخیره کرده و با بازگشت به همان کامپوننت از instance ذخیره شده استفاده می‌کند.

۵ متد وجود دارد که یک به یک با ترتیب خاصی اجرا می‌شوند:

ShouldDetach
موقع جابه جایی از یک کامپوننت به کامپوننت دیگر فراخوانی می‌شود تا مشخص کند به جای از بین بردن نتیجه کامپوننت می‌توان آن را ذخیره کرد یا خیر که نتیجه را بصورت true یا false برمی‌گرداند.


Store
زمانی که ShouldDetach مقدار true برمی‌گرداند این متد فراخوانی شده و instance آن کامپوننت را ذخیره می‌کند(نحوه ذخیره سازی به ما بستگی دارد و می‌توان آن را در ابجکت، سرویس یا هرچیز دیگر ذخیره کنیم. همچنین برای دسترسی آسان‌تر می‌توانیم آن را در key-value ذخیره کنیم).


ShouldAttach
این متد خروجی true یا false برمی‌گرداند به این معنی که آیا قصد داریم از چیزی که Detach شده مجدد استفاده کنیم یا خیر، اگر بخواهیم مجدد استفاده کنیم true و در غیر این صورت false برمی‌گرداند.

Retrieve
هنگامی که ShouldAttach مقدار true برگرداند این متد فراخوانی شده و instance کامپوننتی که در متد store ذخیره کرده بودیم را برمی‌گرداند.

ShouldReusedRoute
این متد برای تعیین اینکه آیا مسیر باید دوباره استفاده شود یا خیر استفاده می‌شود.


همینطور می‌توان استفاده از RoutrReuseStrategies را سفارشی و فقط برای یک سری از کامپوننت‌های خاص نوشت، به این صورت که آرایه‌ای از stringها تعریف کرده و route کامپوننت‌هایی که قصد داریم اطلاعات آن ها را ذخیره کنیم را به آن دهیم.

‼️برای دیدن نمونه مثال و مطالعه بیشتر به لینک مراجعه کنید.


#زهرا_خانی (لینکدین)

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

__________
👍144🔥3🤩2🥰1🎉1
پیشگیری از تولید کد بد با LINQ

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

مقاله زیر این نکات را شرح می‌دهد.

http://mehrandvd.me/2016/03/28/linq-the-bad-parts/

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

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

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

__________
🔥4👍2
چطور برنامه‌نویسی موازی را برای مادربزرگتان توضیح دهید!؟

برنامه نویسی موازی (Parallel Programming) و برنامه نویسی ناهمگام (Asynchronous Programming) برای اغلب برنامه‌نویسان، ممکن است جدید یا نامفهوم باشد. همه در مورد آن شنیده‌ایم ولی اغلب واضح نیست که دقیقا چیست و چرا سخت است. یک مفهوم پایه برای درک این مفاهیم پایه Thread یا نخ است. نخ‌ها مفاهیمی هستند که وظیفه انجام کارها روی CPU را دارند. در دنیای ما انسان‌ها کسانی هستند که کار انجام می‌دهند. مقاله زیر مفهوم «نخ» را به «انسان» شبیه دیده‌است و سعی کرده‌است مفاهیم پیچیده دنیای برنامه‌نویسی را با مفاهیم ساده‌ دنیای ما انسان‌ها توضیح دهد.

http://mehrandvd.me/2016/04/18/parallel-programming-grandmother/

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

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

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

__________
👍6🔥1
دیباگ راحت‌تر با DebuggerDisplayAttribute!

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

یکی از راه‌هایی که بتوانیم اطلاعات کافی مورد نیاز از یک آبجکت را در حین دیباگ به دست آوریم override کردن متد ToString کلاس است!

در این روش دو نکته وجود دارد:
۱- از آنجایی که ما متد ToString را override کرده‌ایم، باعث می‌شود Expression Evaluator تابعی را فراخوانی کند که می‌تواند باعث کند‌تر شدن دیباگ داده‌ها باشد.
۲- نمی‌توانیم داده‌های متفاوتی برای دیباگ و ToString داشته باشیم.

بنابراین، بهترین راه برای نمایش مقدار مورد نظر داده‌های شی در زمان اجرا به روشی ساده و معنی‌دار چیست؟

اتریبیوت DebuggerDisplay اینجا به کمک می‌آید.

استفاده از ویژگی DebuggerDisplayAttribute به Expression Evaluator دستور می‌دهد تا عبارت ارائه شده را ارزیابی کند و مقدار حاصل را در پنجره دیباگ نمایش دهد.

در constructor یک رشته را به عنوان ورودی قبول می‌کند و در آن رشته می‌توان هر کدام از پراپرتی‌های کلاس مورد نظر را استفاده کرد.

برای نمونه تکه کد زیر را ببینید:

[DebuggerDisplay("Name: {FirstName} - {LastName}")]
public class Customer
{
public string FirstName { get; set; }
public string LastName { get; set; }

public Customer(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}


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

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

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

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

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

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

_________
👍14🔥32
آشنایی با استفاده از لامبدا در جاوا

مفهوم «Lambda Expression» یکی از مفاهیم جذابی است که از دنیای Functional Programming وارد زبان‌های شی‌گرا شده‌است. در نسخه Java 8 این امکان به زبان جاوا هم اضافه شده‌است. عبارات لامبدا باعث می‌شوند برنامه نویسی به شدت لذت‌بخش‌تر و کم‌خطا تر شوند. همچنین خوانایی کد می‌تواند با استفاده از لامبدا بسیار بهتر شود. مقاله زیر که به توضیح چگونگی استفاده از لامبدا در زبان جاوا پرداخته است، نشان می‌دهد چگونه برنامه نویسی با این مفهوم لذت‌بخش‌تر شده است.

http://mehrandvd.me/2015/09/10/tasty-lambdas-in-java-8/

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

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

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

__________
👍71
با NgModule در انگولار خداحافظی کنید :)

در انگولار امکانی فراهم شده تحت عنوان standalone component. من این عنوان را «کامپوننت مستقل» ترجمه کرده‌ام.

کامپوننت‌های مستقل راه ساده‌ای برای ساخت برنامه‌های انگولار ارائه می‌دهند، همچنین کامپوننت‌ها، دایرکتیوها و پایپ‌های مستقل، با کاهش نیاز به NgModuleها تجربه برنامه‌نویسی بهتری را رقم می‌زنند.
کامپوننت مستقل انگولار در نسخه 14 تحت developer preview منتشر شد و برای استفاده در نسخه 15 تثبیت شد. اکنون تیم انگولار در نسخه 16 برای تسهیل انتقال اپلیکیشن‌ها به کامپوننت‌های مستقل، راهنمای مهاجرت (standalone migration guid) را نیز تهیه کرده‌اند. اپلیکیشن‌های موجود می‌توانند به‌صورت اختیاری و تدریجی و بدون دردسر به روش جدید مهاجرت کنند.

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

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

همچنین کامپوننت‌های مستقل می‌توانند به کامپوننت‌های موجود مبتنی بر NgModules وارد شوند. بدین صورت اپلیکیشن‌های موجود (که امروزه از NgModules استفاده می‌کنند)، می‌توانند به تدریج خود را با سبک جدید و کامپوننت‌های مستقل وفق دهند.

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

روتر انگولار نیز به‌روزرسانی و ساده‌سازی شده است تا بتواند از کامپوننت‌های مستقل بهره‌مند شود. با این به‌روزرسانی، در بسیاری از سناریوهای معمول و lazy-loading دیگر نیازی به NgModule نیست.

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

___

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

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

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

_______
👍65🔥3
تجربه برنامه‌نویس یا Developer Experience

تجربه کاربری یا UX یکی از مفاهیمی است که تاثیر زیادی در محبوب شدن یک محصول دارد. مفهوم DX یا Developer Experience نیز مفهومی است که تجربه یک برنامه‌نویس هنگام استفاده از پلتفرم یا فریم‌ورک خاصی را بررسی می‌کند. چرا یک پلتفرم یا فریم‌ورک محبوب می‌شود و دیگری نه؟ این سوالی‌ است که عوامل زیادی در پاسخ دادن به آن موثر هستند. اینکه یک برنامه نویس هنگام کار با آن پلتفرم چه تجربه‌ای احساس می‌کند یکی از عوامل مهم موفقیت پلتفرم‌هاست. در مقاله زیر مفهوم جدیدی به نام Dotability‌ معرفی شده که می‌توان به وسیله آن کتابخانه‌ها و فریم‌ورک‌های مختلف را از لحاظ DX بررسی کرد.

http://mehrandvd.me/2016/05/31/developer-experience-dotability/

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

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

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

__________
👍3
از EF Core 8 Preview 1 چه خبر؟

در نوامبر EF Core 8 (EF8) 2023 همراه با دات نت ۸ منتشر خواهد شد.
هم اکنون EF8 در daily builds با تمام ویژگی‌ها در دسترس است.
در این مقاله به توضیح مختصر ویژگی‌های EF8 Preview 1 پرداخته‌ایم.

۱- ویژگی raw sql queries در EF7 معرفی شد.
در EF7، شما می‌توانید Raw SQL queries را برای scalar type ها اجرا کنید. اما در EF8، شما می‌توانید Raw SQL queries را برای هر نوع از داده مپ کنید.

۲- در EF8 متد AsNoTracking علاوه براینکه باعث می‌شود Entity ها track نشوند، باعث می‌شود به صورت پیش فرض از قابلیت  lazy loading for navigations  نیز بتوانیم استفاده کنیم.

در استفاده از این ویژگی باید موارد زیر را در نظر بگیرید‌:
• این ویژگی زمانی موفق خواهد بود که تا پایان اجرای لود کویری DbContext استفاده شده Dispose نشود.
• در این حالت Entity ها به Dbcontext رفرنس دارند بنابراین در مواردی که زمان زیادی می‌برند ممکن است باعث Memory Leak شود.
• تنظیم صریح وضعیت Entity به Detached باعث قطع ارتباط آن با Dbcontext خواهد شد و در نتیجه Lazy Loading دیگر کار نخواهد کرد.
• در نظر داشته باشید که Lazy Loading به صورت synchronous عمل می‌کند و دسترسی به یک پراپرتی به صورت asynchronous ممکن نیست.

در EF8 لود navigation های track نشده زمانی که Entity و یا Navigationهای آن برای لود به صورت Lazy کانفیگ نشده باشد هم پشتیبانی می‌شود. برخلاف Lazy loading ، این بارگذاری صریح می‌تواند به صورت asynchronously انجام شود.

۳- تایپ‌های System.DateOnly و System.TimeOnly در NET 6. معرفی شد  و از زمان معرفی برای چندین ارائه دهنده پایگاه داده (مانند SQLite، MySQL و PostgreSQL) پشتیبانی می‌شوند.
در SQL Server، با انتشار اخیر بسته Microsoft.Data.SqlClient که NET 6. را هدف قرار می دهد، پشتیبانی از این انواع در سطح ADO.NET اضافه شد. این به نوبه خود راه را برای پشتیبانی در EF8 برای DateOnly و TimeOnly به عنوان ویژگی در انواع موجودیت هموار کرد.

۴- در EF7 ویژگی Jason Column Mapping معرفی شد. و در EF8 بهبود هایی در این ویژگی ایجاد شده است. EF8 از indexing در آرایه های JSON هنگام اجرای پرس و جو پشتیبانی می کند.

علاوه بر بهبود‌هایی که در بالا توضیح داده شد، EF8 Preview 1 همچنین شامل بسیاری از بهبودهای کوچکتر است. برخی از این موارد به کارکردهای داخلی EF Core مربوط می‌شوند، حتی به استثنای آن‌ها، موارد زیادی وجود دارد که ممکن است برای توسعه‌دهندگان برنامه جالب باشد. لینک‌های زیر را برای مشاهده این موارد ببینید:

•  Translate ElementAt(OrDefault)
•  Translate ToString() on a string column
•  Generic overload of ConventionSetBuilder.Remove
•  Allow UseSequence and HiLo on non-key properties
•  Pass query tracking behavior to materialization interceptor
•  Use case-insensitive string key comparisons on SQL Server
•  Allow value converters to change the DbType
•  Resolve application services in EF services
•  Numeric rowersion properties automatically convert to binary
•  Allow transfer of ownership of DbConnection from application to DbContext
•  Provide more information when 'No DbContext was found' error is generated


🔗 برای مشاهده و مطالعه بیشتر اینجا را ببینید.

_________

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

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

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

_________
👍19
آشنایی با مفاهیم Covariance و Contravariance

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

http://mehrandvd.me/2016/06/18/covariant-and-contravariant/

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

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

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

__________
👍7
🔶 تغییرات Input در Angular 16

نوشتن کامپوننت‌های کوچک در اغلب موارد روشی خوب برای مدیریت کدهای Angular محسوب می‌شود. با نوشتن کامپوننت‌های کوچک باید به فکر اشتراک گذاری داده‌ها بین کامپوننت‌ها باشیم. یکی از روش‌های رایج اشتراک گذاری داده‌ها بین کامپوننت‌ها استفاده از Inputها است که در Angular 16 هم تغییراتی داشته است.

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

@component({
  selector : "app_child",
  templateUrl : "./child.component.html",
  styleUrls: [child.component.less"],
})

export class ChildComponent {
  @Input() id: string;
}

در این حالت کامپوننت فرزند به عنوان تگ در فایل html کامپوننت والد تعریف می‌شود:

<app_child [id] = "currentId"> </app_child>

که currentId در فایل ts کامپوننت پدر مقداردهی شده است.


دو ویژگی جدید در Angular 16 :

‼️Self-closing tags

یکی از این ویژگی‌ها عدم نیاز به بستن تگ کامپوننت فرزند است که این بهبود کوچک منجر به صرفه‌جویی در تایپ می‌شود.

<app_child [id] = "currentId"/>

‼️Required inputs

ویژگی دیگری که در Angular 16 اضافه شده است قابلیت تعریف Inputها بصورت Required است. با استفاده از این ویژگی می‌توانیم از وجود داده‌های لازم قبل از اجرای منطق کامپوننت اطمینان حاصل کنیم که نتیجه آن کیفیت کد بهتر و خطاهای کمتر است.

export class ChildComponent {
           👇
  @Input({ required: true }) id: string;
}


برای مطالعه سایر ویژگی‌هایی که در Angular 16  اضافه شده است می‌توانید به اینجا سر بزنید.

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

#زهرا_خانی (لینکدین)

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

__________
4👍4🔥2
خطر اضافه کردن فیچر جدید به نرم‌افزار!

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

مثال زیر از تیم توسعه C# آورده شده‌است که در مورد کاربرد دو امکان این زبان که در نسخه‌های ۵ و ۶ اضافه شد صحبت می‌کند.

http://mehrandvd.me/2016/05/02/steady-consistent-flow-features/

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

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

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

__________
👍101🔥1
C#12 Preview!

سی‌شارپ آپدیت‌های خود را در ادامه فعالیت‌هایش جهت ساده‌تر کردن کد‌ها و بهبود در فضاهای اشغال شده توسط کد ارائه می‌کند.

برخی از ویژگی های C# 12 در preview ها معرفی شده‌اند و می‌توانید این ویژگی‌ها را با استفاده از Visual Studio 17.6 Preview  یا NET 8 preview.  امتحان کنید.

مواردی که در C#12 Preview معرفی شده‌اند:

۱- ویژگی Primary constructors برای کلاس‌ها و ساختارهای غیر رکورد. 
شما اکنون می‌توانید primary constructors را در هر کلاس و ساختاری ایجاد کنید. Primary constructors دیگر محدود به record types نیستند. پارامترهای primary constructor در scope بدنه کلاس هستند.

با استفاده از (...)this داخل کلاس، می‌توانید از قابلیت primary constructor استفاده کنید.

مثال:‍‍‍‍‍‍‍
Public Student(int id, string name) : this(id, name, Enumerable.Empty<decimal>()) { }

اضافه کردن primary constructor به یک کلاس، از تعریف ضمنی constructor بدون پارامتر جلوگیری می‌کند.

۲- مقدار پیش فرض برای پارامترهای عبارت lambda
سی‌شارپ قبلا این امکان را فراهم کرده بود که برای پارامترهای ورودی متد مقادیر پیش‌فرض تعریف کنید. این امکان برای lambda نیز فراهم شده است. مقدار پیش‌فرض برای پارامترهای عبارت lambda به شما این امکان را می‌دهد که بتوانید پارامترهایی را که در عبارت lambda استفاده می‌شوند، با مقدار پیش‌فرض مقدار‌دهی کنید.

۳- استفاده از alias برای هر نوعی
در ورژن‌های قبلی سی‌شارپ این امکان وجود داشت که شما هنگام استفاده از یک کلاس، به جای استفاده مستقیم از آن کلاس، در قسمت using ها، کلاس مورد نظر خود را به صورت مستقیم using کنید و به آن نامی دلخواه بدهید، سپس داخل کد خود برای دسترسی به کلاس مورد نظر از آن نام دلخواه که موقع using معرفی کرده‌اید استفاده کنید.

در این ورژن، شما می‌توانید از دستورالعمل using alias برای  هر نوعی، نه فقط named types، استفاده کنید. این بدان معناست که شما می‌توانید alias های semantic برای tuple types، array types، pointer types یا دیگر unsafe types ایجاد کنید.

مثال:
using Measurement = (string Units, int Distance);


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

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

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

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

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

______
👍195🔥4
فلسفه Spacive Design جایگزینی برای Responsive Design

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

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

هنوز خیلی زود است که بتوان در مورد آینده طراحی UI/UX اظهار نظر کرد. ولی به نظر من یکی از آینده‌های محتمل برای طراحی UI/UX‌ نسل آینده نرم‌افزارها طراحی «فضاگرا» است. طراحی فضاگرا نوعی طراحی نرم‌افزار است که به آن این امکان را می‌دهد تا قسمت‌های مختلف خود را در فضای اطراف کاربر پخش کند. برای مثال فرض کنید هنگام کار با فیسبوک، تایم‌لاین را روی دیوار روبروی خود ببینید و نوتیفیکیشن‌ها را روی ساعد خود. به این ترتیب نرم‌افزار فیسبوک توانسته در فضای اطراف شما مستقر شود.

http://mehrandvd.me/2016/07/12/hololens-spacive-design-new-era-uiux/

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

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

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

__________
👍62🔥2
امکانات جدید NET 8. برای Attribute ها

1️⃣ RequiredAttribute.DisallowAllDefaultValues[]

- اتربیوت Required می‌تواند برای ممنوع کردن مقادیر پیش‌فرض با مشخص کردن RequiredAttribute.DisallowAllDefaultValues پیکربندی شود.

- این موضوع شما را مجبور می‌کند تا هر نوعی که اتربیوت Required دارد، با یک مقدار غیرپیش‌فرض مقداردهی اولیه شود.

2️⃣ RangeAttribute محدوده‌های انحصاری

- اتربیوت Range اکنون از محدوده‌های انحصاری با مشخص کردن RangeAttribute(low, high, true) پشتیبانی می‌کند.

- پارامتر سوم مشخص می‌کند که آیا محدوده‌ها شامل (false) هستند یا انحصاری (true).

برای درک بهتر مثال زیر را در نظر بگیرید:
[Range(1d, 3d, MinimumIsExclusive = true, MaximumIsExclusive = true)]
public double Sample { get; set; }

مثال بالا را با یادآوری یک مساله ریاضی توضیح می‌دهم. در ریاضیات فرق بین دو عبارت زیر چیست؟
[1,3]
(1,3)

عبارت اول دقیقا شامل ۱ و ۳ هم می‌شود ولی عبارت دوم به اینصورت نیست.
حالا اگر این دو مقدار MinimumIsExclusive و MaximumIsExclusive را false دهیم یعنی عبارت اولی را می‌خوایم اعمال کنیم [1,3] ولی اگر true مقدار دهی کنیم یعنی عبارت دومی مدنظر ماست (1,3)
یعنی اگه این دو را true دهید و هنگام استفاده از Sample مقدار ۱ یا ۳ را بدهید این اتربیوت اجازه این کار رو به شما نمی‌دهد.

3️⃣ LengthAttribute

- اتربیوت Length از قبل می‌توانست برای مشخص کردن طول دقیق مورد نیاز برای رشته‌ها استفاده شود. در این آپدیت می‌تواند برای مشخص کردن تعداد اعضای آرایه نیز استفاده شود.
[Length(10, 20)]
public ICollection<int> Values { get; set; }

این آرایه باید حداقل ۱۰ و حداکثر ۲۰ عضو داشته باشد.

4️⃣ AllowedValuesAttribute و DeniedValuesAttribute

-اتربیوت AllowedValuesAttribute مجموعه‌ای از مقادیر مجاز برای یک پارامتر را مشخص می‌کند.

-اتربیوت DeniedValuesAttribute مقادیری را که مجاز نیستند مشخص می‌کند.

- این موارد کنترل بیشتری نسبت به RangeAttribute برای مقادیر مجاز فراهم می‌کنند.

[AllowedValues("chocolate", "vanilla", "strawberry")]
public string IceCreamFlavor { get; set; }

[DeniedValues("beetroot", "eggplant", "rutabaga")]
public string CakeFlavor { get; set; }

آرایه اولی صرفا مجاز به داشتن مقادیر "chocolate", "vanilla", "strawberry" است و آرایه دوم نباید مقادیر "beetroot", "eggplant", "rutabagaرا داشته باشد.


5️⃣ System.Reflection Enhancements

به روز رسانی APIهای Reflection برای درک اتربیوت‌های جدیدی که در بالا مطرح شد.

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

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

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

__________
👍211🔥1👏1
چگونه به صورت کارآمد یک آرایه را به صورت تصادفی در C# مرتب کنیم؟

🔸رندم کردن آرایه با استفاده از Linq
ابزار جست و جوی LINQ یکی از قدرتمندترین امکاناتی است که در C# در اختیار ما قرار دارد. این ابزار روش‌های مختلف کنترل داده‌ها را فراهم می‌کند.
معمولاً از LINQ برای پرس و جو یا فیلتر کردن مجموعه داده‌ها استفاده می‌کنیم، اما می‌توانیم برای تصادفی سازی نیز از LINQ استفاده کنیم. در این شیوه از ()OrderBy برای مرتب سازی داده‌ها براساس یک کلید مشخص استفاده می‌شود. برای این کار می‌توانیم از روش مرتب کردن به وسیله GUID و روش مرتب کردن به وسیله کلاس Random استفاده کنیم.

🔻رندم کردن به وسیله GUID
با ترتیب دادن براساس ()Guid.NewGuid، که برای هر عنصر در آرایه یک شناسه منحصر به فرد ایجاد می‌کند، عناصر آرایه به صورت تصادفی با هم چیده می‌شوند.

array.OrderBy(x => Guid.NewGuid()).ToArray();

🔻رندم کردن آرایه با یک کلاس رندم
این بار داده‌ها را بر اساس اعداد تصادفی تولید شده با استفاده از متد Next از Random.Shared مرتب می کنیم.

array.OrderBy(x => Random.Shared.Next()).ToArray();

🔸رندم کردن آرایه در #C با استفاده از الگوریتم Fisher-Yates

    int count = array.Length;
while (count > 1)
{
int i = Random.Shared.Next(count--);
(array[i], array[count]) = (array[count], array[i]);
}

در هر تکرار حلقه while، یک عدد تصادفی تولید می‌شود و عنصر مربوط به ایندکس عدد تولید شده تصادفی در آرایه با عنصر اشاره شده توسط متغیر count با استفاده از Tuple جابجا می‌شود. این کار تا زمانی ادامه پیدا می‌کند که count برابر ۱ شود. در نهایت، آرایه تغییر یافته را برمی‌گردانیم.
این روش به صورت مستقیم روی آرایه ورودی عمل می‌کند و آن را برمی‌گرداند، در حالی که روش‌های OrderBy یک کپی از آرایه را برمی‌گردانند.

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

    int count = array.Length;
var arrayCopy = new int[count];
Array.Copy(array, arrayCopy, count);
while (count > 1)
{
int i = Random.Shared.Next(count--);
(arrayCopy[i], arrayCopy[count]) = (arrayCopy[count], arrayCopy[i]);
}
return arrayCopy;

این روش تقریباً شبیه به روش قبلی است با این استثنا که از روش Array.Copy() برای کپی آرایه ورودی استفاده می‌کنیم. در بخش دیگری از متد، با متغیر arrayCopy کار می‌کنیم و پس از پایان کار آن را برمی‌گردانیم.

💠 ملاحظات پرفورمنسی هنگام تصادفی سازی یک آرایه در C#
🔻روش الگوریتم Fisher-Yates تا حد زیادی بهترین عملکرد را دارد و در رتبه اول قرار دارد و تقریباً هیچ تخصیص حافظه‌ای ندارد.
🔻نسخه اصلاح شده الگوریتم در رتبه دوم قرار دارد و به دلیل کپی کردن آرایه ورودی، تخصیص حافظه بیشتری نسبت به نسخه اصلی دارد.
🔻سپس، روش استفاده از Linq و کلاس Random با زمان اجرای بالاتر و تخصیص حافظه قابل توجه بالاتر نسبت به دو روش قبل - در رتبه سوم قرار دارد.
🔻و در نهایت، روش استفاده از Linq و GUID در میان چهار روش، در رتبه آخر قرار دارد و همچنین بالاترین تخصیص حافظه را دارد.

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

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

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

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

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

______
👍7🔥32
آشنایی با Domain Validation

اعتبار سنجی دامنه، فرآیندی است برای بررسی اینکه «آیا داده ها و عملیات در مدل دامنه ما با قوانین تجاری و متغیرهای ثابت سازگار هستند یا خیر». به عنوان مثال، ممکن است بخواهیم اعتبار یک آدرس ایمیل معتبر باشد، یک نام خالی نباشد، یا اینکه سفارش انجام شده حداقل یک مورد انتخابی دارد.

1. Throw exception
یکی از راه‌های پیاده‌سازی اعتبار دامنه، استفاده از exception و زمانی است که اعتبارسنجی ناموفق است.

این رویکرد دارای معایبی است از جمله:

- استفاده از Throw exception گران است و می‌تواند بر عملکرد تاثیر بگذارد.
- استثناها باید برای موقعیت‌های استثنایی استفاده شوند، نه برای سناریوهای اعتبارسنجی عادی.

2. Result object
یک راه بهتر برای پیاده سازی اعتبار دامنه، بازگشت شیء نتیجه به جای throw exception است. شیء نتیجه یک کلاس ساده است که نتیجه عملیاتی شامل یک پرچم موفقیت، یک مقدار و مجموعه ای از خطاها را در بر می گیرد.

این رویکرد چندین مزیت دارد، از جمله:

- برگرداندن یک شیء نتیجه، ارزانتر و سریعتر از پرتاب کردن استثناها است.
- اشیاء نتیجه می‌توانند چندین خطا را در عملیات مدیریت کنند و نمایش آنها به کاربر یا ثبت آنها را آسان‌تر می‌کند.


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

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

#محمدرضا_پازوکی (لینکدین)

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

______
👍8
نگاهی عمیق‌تر به مفاهیم همزمانی در سی‌شارپ

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

موقعیت‌هایی وجود دارد که نیاز است تا تکه‌هایی از کد به صورت همزمان اجرا شود. در این شرایط می‌توان از Thread ها استفاده کرد. به شرط اینکه از منابع مشترکی استفاده نکنند!
اما استفاده از منابع مشترک برای اجرای Thread ها باعث چه مشکلی می‌شود؟

قابلیت Thread ها این امکان را به ما می‌دهد تا چندین کار را به صورت همزمان انجام دهیم.
آیا تاکنون در حین اجرای یک برنامه کامپیوتری به تعداد thread های اختصاص داده شده به برنامه دقت کرده اید؟
چرا بعضی از برنامه‌ها تعداد Thread کمتری را مشغول می‌کند؟

"Deep Dive into async/await: How to Unlock the Full Potential of C# Concurrency"

اسم ورکشاپی هست که "مهران داودی" با هدف آموزش مفاهیم همزمانی به صورت عمیق بر گذار می‌کند.

🔗 تا کنون یک جلسه از این ورکشاپ برگزار شده است که در این لینک می‌توانید ببینید.
در این جلسه با مفهوم Thread و چالش‌های Shared Memory آشنا می‌شویم.

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

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

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

______
👍164🔥2
✏️ آشنایی و پیاده سازی Value Object

یک Value Object الگویی برای طراحی است که یک شیء تغییرناپذیر را با برابری بر اساس وضعیت آن نشان می‌دهد، نه هویت آن. به این معنی که دو Value Object با هم برابرند، در صورتی که بدون توجه به Reference، خواص و مقادیر یکسانی داشته باشند.

یک Value Object دارای این ویژگی‌ها است:
- تغییرناپذیر است!
- هیچ هویتی ندارد، به این معنی که یک شناسه منحصر به فرد یا ارجاع به شی دیگری ندارد!
- مستقل است!
- قابل مقایسه است!

✏️ برای مشاهده جزئیات پیاده سازی Value Object و نحوه استفاده آن در EF اینجا را مطالعه کنید.

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

#محمدرضا_پازوکی (لینکدین)

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

______
👍8
مدیریت Exception با استفاده از فیلترها در مقایسه با میان افزارها

- میان‌افزار قبل و بعد از pipeline اجرای عملیات اجرا می‌شود، بنابراین نمی‌تواند به action context یا حالت مدل دسترسی داشته باشد.

- فیلترها در داخل pipeline اجرا می‌شوند، بنابراین به action context و model state دسترسی دارد و می تواند response status code و هدرها را قبل از اینکه در response stream نوشته شود تغییر دهد.

- فیلترها برای به دام انداختن exception که در actions رخ می‌دهند مناسب هستند.

- فیلترها به اندازه میان‌افزارها برای رسیدگی به خطا انعطاف پذیر نیستند

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

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

#محمدرضا_پازوکی (لینکدین)

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

______
👍71
استفاده موثر و درست از HTTP Client

استفاده درست از HttpClient و DelegatingHandler در ASP.NET Core برای ایجاد کلاینت‌های HTTP سفارشی می‌تواند نگرانی‌های عمومی مانند لاگ ورود به سیستم، احراز هویت، ذخیره‌سازی و غیره را مدیریت کند.

- یک HttpClient کلاسی است که یک انتزاع سطح بالا برای ارسال درخواست‌های HTTP و دریافت پاسخ های HTTP فراهم و از عملیات asynchronous cancellation tokens, headers, content پشتیبانی می‌کند. می‌توانید از HttpClient برای مصرف هر سرویس HTTP، مانند REST API، خدمات SOAP و غیره استفاده کنید.

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

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

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

#محمدرضا_پازوکی (لینکدین)

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

______
👍10