تجربه برنامهنویس یا Developer Experience
تجربه کاربری یا UX یکی از مفاهیمی است که تاثیر زیادی در محبوب شدن یک محصول دارد. مفهوم DX یا Developer Experience نیز مفهومی است که تجربه یک برنامهنویس هنگام استفاده از پلتفرم یا فریمورک خاصی را بررسی میکند. چرا یک پلتفرم یا فریمورک محبوب میشود و دیگری نه؟ این سوالی است که عوامل زیادی در پاسخ دادن به آن موثر هستند. اینکه یک برنامه نویس هنگام کار با آن پلتفرم چه تجربهای احساس میکند یکی از عوامل مهم موفقیت پلتفرمهاست. در مقاله زیر مفهوم جدیدی به نام Dotability معرفی شده که میتوان به وسیله آن کتابخانهها و فریمورکهای مختلف را از لحاظ DX بررسی کرد.
http://mehrandvd.me/2016/05/31/developer-experience-dotability/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
تجربه کاربری یا UX یکی از مفاهیمی است که تاثیر زیادی در محبوب شدن یک محصول دارد. مفهوم DX یا Developer Experience نیز مفهومی است که تجربه یک برنامهنویس هنگام استفاده از پلتفرم یا فریمورک خاصی را بررسی میکند. چرا یک پلتفرم یا فریمورک محبوب میشود و دیگری نه؟ این سوالی است که عوامل زیادی در پاسخ دادن به آن موثر هستند. اینکه یک برنامه نویس هنگام کار با آن پلتفرم چه تجربهای احساس میکند یکی از عوامل مهم موفقیت پلتفرمهاست. در مقاله زیر مفهوم جدیدی به نام Dotability معرفی شده که میتوان به وسیله آن کتابخانهها و فریمورکهای مختلف را از لحاظ DX بررسی کرد.
http://mehrandvd.me/2016/05/31/developer-experience-dotability/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
Dot Philosophy
Developer Experience: Dotability - Dot Philosophy
Again, this famous 'X', as in UX. It's all about experience. The good experience is the key that makes a product valuable. We are always talking about user experience, but here in this post, I am going to talk about developer experience. As a developer, you…
👍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
_________
در نوامبر 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
_________
GitHub
efcore/docs/DailyBuilds.md at main · dotnet/efcore
EF Core is a modern object-database mapper for .NET. It supports LINQ queries, change tracking, updates, and schema migrations. - dotnet/efcore
👍19
آشنایی با مفاهیم Covariance و Contravariance
مفاهیم Covariance و Contravariance یکی از مباحث مهم در زبانهای برنامهنویسی مدرن محسوب میشود. تسلط بر این مفاهیم به طراحان فریمورکها و پلتفرمها کمک میکند تصمیمات مناسبتری در طراحی کلاسها داشته باشند.
از آنجایی این مفاهیم انتزاعی هستند، معمولا فهم آنها در وهله اول سخت به نظر میرسد. مقاله زیر با چند مثال قابل لمس این مفاهیم را به زبان سادهتری توضیح داده تا فهم آن لذتبخشتر و آسانتر شود.
http://mehrandvd.me/2016/06/18/covariant-and-contravariant/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
مفاهیم Covariance و Contravariance یکی از مباحث مهم در زبانهای برنامهنویسی مدرن محسوب میشود. تسلط بر این مفاهیم به طراحان فریمورکها و پلتفرمها کمک میکند تصمیمات مناسبتری در طراحی کلاسها داشته باشند.
از آنجایی این مفاهیم انتزاعی هستند، معمولا فهم آنها در وهله اول سخت به نظر میرسد. مقاله زیر با چند مثال قابل لمس این مفاهیم را به زبان سادهتری توضیح داده تا فهم آن لذتبخشتر و آسانتر شود.
http://mehrandvd.me/2016/06/18/covariant-and-contravariant/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
👍7
🔶 تغییرات Input در Angular 16
نوشتن کامپوننتهای کوچک در اغلب موارد روشی خوب برای مدیریت کدهای Angular محسوب میشود. با نوشتن کامپوننتهای کوچک باید به فکر اشتراک گذاری دادهها بین کامپوننتها باشیم. یکی از روشهای رایج اشتراک گذاری دادهها بین کامپوننتها استفاده از Inputها است که در Angular 16 هم تغییراتی داشته است.
گاهی نیاز داریم که یک سری اطلاعات و دادهی پردازش شده را از کامپوننت والد به فرزند ارسال کنیم.
دو ویژگی جدید در Angular 16 :
‼️Self-closing tags
یکی از این ویژگیها عدم نیاز به بستن تگ کامپوننت فرزند است که این بهبود کوچک منجر به صرفهجویی در تایپ میشود.
ویژگی دیگری که در Angular 16 اضافه شده است قابلیت تعریف Inputها بصورت Required است. با استفاده از این ویژگی میتوانیم از وجود دادههای لازم قبل از اجرای منطق کامپوننت اطمینان حاصل کنیم که نتیجه آن کیفیت کد بهتر و خطاهای کمتر است.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#زهرا_خانی (لینکدین)
کانال تلگرامی:
@SoftwarePhilosophy
__________
نوشتن کامپوننتهای کوچک در اغلب موارد روشی خوب برای مدیریت کدهای 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
__________
Medium
Angular v16 is here!
Six months ago, we reached a significant milestone in Angular’s simplicity and developer experience by graduating the standalone APIs from…
❤4👍4🔥2
خطر اضافه کردن فیچر جدید به نرمافزار!
اضافه کردن فیچر به نرمافزار غالبا ویژگی مثبتی به نظر میرسد. ولی وقتی تیمی دارید که قدرت بسیار بالایی دارد اضافه کردن فیچرها با سرعت خیلی زیاد میتواند نکاتی منفی به همراه داشته باشد. وقتی قدرت اضافه کردن امکانات با سرعت زیاد را دارید باید محتاط باشید تا امکانات جدید راهحلهایی جدید برای یک مسئله حل شده نباشند. داشتن تیم قدرتمند این امکان را به مدیران میدهد که بتوانند سریع ایدههای ذهنی خود را پیادهسازی کنند. در این حین باید مراقب بود این امکانات با هم، همپوشانی نداشته باشند.
مثال زیر از تیم توسعه C# آورده شدهاست که در مورد کاربرد دو امکان این زبان که در نسخههای ۵ و ۶ اضافه شد صحبت میکند.
http://mehrandvd.me/2016/05/02/steady-consistent-flow-features/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
اضافه کردن فیچر به نرمافزار غالبا ویژگی مثبتی به نظر میرسد. ولی وقتی تیمی دارید که قدرت بسیار بالایی دارد اضافه کردن فیچرها با سرعت خیلی زیاد میتواند نکاتی منفی به همراه داشته باشد. وقتی قدرت اضافه کردن امکانات با سرعت زیاد را دارید باید محتاط باشید تا امکانات جدید راهحلهایی جدید برای یک مسئله حل شده نباشند. داشتن تیم قدرتمند این امکان را به مدیران میدهد که بتوانند سریع ایدههای ذهنی خود را پیادهسازی کنند. در این حین باید مراقب بود این امکانات با هم، همپوشانی نداشته باشند.
مثال زیر از تیم توسعه C# آورده شدهاست که در مورد کاربرد دو امکان این زبان که در نسخههای ۵ و ۶ اضافه شد صحبت میکند.
http://mehrandvd.me/2016/05/02/steady-consistent-flow-features/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
👍10❤1🔥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 استفاده کنید.
مثال:
۲- مقدار پیش فرض برای پارامترهای عبارت lambda
سیشارپ قبلا این امکان را فراهم کرده بود که برای پارامترهای ورودی متد مقادیر پیشفرض تعریف کنید. این امکان برای lambda نیز فراهم شده است. مقدار پیشفرض برای پارامترهای عبارت lambda به شما این امکان را میدهد که بتوانید پارامترهایی را که در عبارت lambda استفاده میشوند، با مقدار پیشفرض مقداردهی کنید.
۳- استفاده از alias برای هر نوعی
در ورژنهای قبلی سیشارپ این امکان وجود داشت که شما هنگام استفاده از یک کلاس، به جای استفاده مستقیم از آن کلاس، در قسمت using ها، کلاس مورد نظر خود را به صورت مستقیم using کنید و به آن نامی دلخواه بدهید، سپس داخل کد خود برای دسترسی به کلاس مورد نظر از آن نام دلخواه که موقع using معرفی کردهاید استفاده کنید.
در این ورژن، شما میتوانید از دستورالعمل using alias برای هر نوعی، نه فقط named types، استفاده کنید. این بدان معناست که شما میتوانید alias های semantic برای tuple types، array types، pointer types یا دیگر unsafe types ایجاد کنید.
مثال:
🔗 لینک مقاله در ویرگول
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
سیشارپ آپدیتهای خود را در ادامه فعالیتهایش جهت سادهتر کردن کدها و بهبود در فضاهای اشغال شده توسط کد ارائه میکند.
برخی از ویژگی های 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
______
👍19❤5🔥4
فلسفه Spacive Design جایگزینی برای Responsive Design
چند سالی است که طراحی Responsive به عنوان یکی از مهمترین فلسفههای طراحی برنامههای جدید شناخته میشود. اگر به علت ظهور این مدل تفکر در طراحی فکر کنید، متوجه خواهید شد که ظهور دستگاههایی با اندازههای مختلف و با امکانات شبیه هم باعث خلق چنین تفکری شده، نوعی طراحی که بتوان کاربری مناسبی روی دستگاههای با اندازه مختلف داشته باشد.
بنابراین ظهور یک دستگاه میتواند باعث ایجاد فلسفههای جدید طراحی شود. در سالهای اخیر به نظر میرسد یک مدیای جدید در راه است. دستگاههایی که امکان ایجاد واقعیت مجازی دارند. شرکتهای بزرگی مانند گوگل، سونی و مایکروسافت در حال هدایت این بازار هستند. به نظر من ورود این دستگاهها به بازار باعث ایجاد فلسفههای جدیدی در طراحی میشود.
هنوز خیلی زود است که بتوان در مورد آینده طراحی UI/UX اظهار نظر کرد. ولی به نظر من یکی از آیندههای محتمل برای طراحی UI/UX نسل آینده نرمافزارها طراحی «فضاگرا» است. طراحی فضاگرا نوعی طراحی نرمافزار است که به آن این امکان را میدهد تا قسمتهای مختلف خود را در فضای اطراف کاربر پخش کند. برای مثال فرض کنید هنگام کار با فیسبوک، تایملاین را روی دیوار روبروی خود ببینید و نوتیفیکیشنها را روی ساعد خود. به این ترتیب نرمافزار فیسبوک توانسته در فضای اطراف شما مستقر شود.
http://mehrandvd.me/2016/07/12/hololens-spacive-design-new-era-uiux/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
چند سالی است که طراحی Responsive به عنوان یکی از مهمترین فلسفههای طراحی برنامههای جدید شناخته میشود. اگر به علت ظهور این مدل تفکر در طراحی فکر کنید، متوجه خواهید شد که ظهور دستگاههایی با اندازههای مختلف و با امکانات شبیه هم باعث خلق چنین تفکری شده، نوعی طراحی که بتوان کاربری مناسبی روی دستگاههای با اندازه مختلف داشته باشد.
بنابراین ظهور یک دستگاه میتواند باعث ایجاد فلسفههای جدید طراحی شود. در سالهای اخیر به نظر میرسد یک مدیای جدید در راه است. دستگاههایی که امکان ایجاد واقعیت مجازی دارند. شرکتهای بزرگی مانند گوگل، سونی و مایکروسافت در حال هدایت این بازار هستند. به نظر من ورود این دستگاهها به بازار باعث ایجاد فلسفههای جدیدی در طراحی میشود.
هنوز خیلی زود است که بتوان در مورد آینده طراحی UI/UX اظهار نظر کرد. ولی به نظر من یکی از آیندههای محتمل برای طراحی UI/UX نسل آینده نرمافزارها طراحی «فضاگرا» است. طراحی فضاگرا نوعی طراحی نرمافزار است که به آن این امکان را میدهد تا قسمتهای مختلف خود را در فضای اطراف کاربر پخش کند. برای مثال فرض کنید هنگام کار با فیسبوک، تایملاین را روی دیوار روبروی خود ببینید و نوتیفیکیشنها را روی ساعد خود. به این ترتیب نرمافزار فیسبوک توانسته در فضای اطراف شما مستقر شود.
http://mehrandvd.me/2016/07/12/hololens-spacive-design-new-era-uiux/
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#مهران_داودی (لینکدین - بلاگ)
کانال تلگرام:
@SoftwarePhilosophy
__________
👍6❤2🔥2
امکانات جدید NET 8. برای Attribute ها
1️⃣ RequiredAttribute.DisallowAllDefaultValues[]
- اتربیوت Required میتواند برای ممنوع کردن مقادیر پیشفرض با مشخص کردن RequiredAttribute.DisallowAllDefaultValues پیکربندی شود.
- این موضوع شما را مجبور میکند تا هر نوعی که اتربیوت Required دارد، با یک مقدار غیرپیشفرض مقداردهی اولیه شود.
2️⃣ RangeAttribute محدودههای انحصاری
- اتربیوت Range اکنون از محدودههای انحصاری با مشخص کردن RangeAttribute(low, high, true) پشتیبانی میکند.
- پارامتر سوم مشخص میکند که آیا محدودهها شامل (false) هستند یا انحصاری (true).
برای درک بهتر مثال زیر را در نظر بگیرید:
[1,3]
(1,3)
عبارت اول دقیقا شامل ۱ و ۳ هم میشود ولی عبارت دوم به اینصورت نیست.
حالا اگر این دو مقدار MinimumIsExclusive و MaximumIsExclusive را false دهیم یعنی عبارت اولی را میخوایم اعمال کنیم [1,3] ولی اگر true مقدار دهی کنیم یعنی عبارت دومی مدنظر ماست (1,3)
یعنی اگه این دو را true دهید و هنگام استفاده از Sample مقدار ۱ یا ۳ را بدهید این اتربیوت اجازه این کار رو به شما نمیدهد.
3️⃣ LengthAttribute
- اتربیوت Length از قبل میتوانست برای مشخص کردن طول دقیق مورد نیاز برای رشتهها استفاده شود. در این آپدیت میتواند برای مشخص کردن تعداد اعضای آرایه نیز استفاده شود.
4️⃣ AllowedValuesAttribute و DeniedValuesAttribute
-اتربیوت AllowedValuesAttribute مجموعهای از مقادیر مجاز برای یک پارامتر را مشخص میکند.
-اتربیوت DeniedValuesAttribute مقادیری را که مجاز نیستند مشخص میکند.
- این موارد کنترل بیشتری نسبت به RangeAttribute برای مقادیر مجاز فراهم میکنند.
5️⃣ System.Reflection Enhancements
به روز رسانی APIهای Reflection برای درک اتربیوتهای جدیدی که در بالا مطرح شد.
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
__________
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
__________
ByteHide Blog
.NET 8 Preview 2 Unveiled: 5 New Features You Need to Know
Get ready to explore the latest features in .NET 8 Preview 2 and how they will change the way you program. Discover them now.
👍21❤1🔥1👏1
چگونه به صورت کارآمد یک آرایه را به صورت تصادفی در C# مرتب کنیم؟
🔸رندم کردن آرایه با استفاده از Linq
ابزار جست و جوی LINQ یکی از قدرتمندترین امکاناتی است که در C# در اختیار ما قرار دارد. این ابزار روشهای مختلف کنترل دادهها را فراهم میکند.
معمولاً از LINQ برای پرس و جو یا فیلتر کردن مجموعه دادهها استفاده میکنیم، اما میتوانیم برای تصادفی سازی نیز از LINQ استفاده کنیم. در این شیوه از ()OrderBy برای مرتب سازی دادهها براساس یک کلید مشخص استفاده میشود. برای این کار میتوانیم از روش مرتب کردن به وسیله GUID و روش مرتب کردن به وسیله کلاس Random استفاده کنیم.
🔻رندم کردن به وسیله GUID
با ترتیب دادن براساس ()Guid.NewGuid، که برای هر عنصر در آرایه یک شناسه منحصر به فرد ایجاد میکند، عناصر آرایه به صورت تصادفی با هم چیده میشوند.
این بار دادهها را بر اساس اعداد تصادفی تولید شده با استفاده از متد Next از Random.Shared مرتب می کنیم.
این روش به صورت مستقیم روی آرایه ورودی عمل میکند و آن را برمیگرداند، در حالی که روشهای OrderBy یک کپی از آرایه را برمیگردانند.
🔻نسخه دیگر این الگوریتم به صورت زیر پیاده سازی میشود.
💠 ملاحظات پرفورمنسی هنگام تصادفی سازی یک آرایه در C#
🔻روش الگوریتم Fisher-Yates تا حد زیادی بهترین عملکرد را دارد و در رتبه اول قرار دارد و تقریباً هیچ تخصیص حافظهای ندارد.
🔻نسخه اصلاح شده الگوریتم در رتبه دوم قرار دارد و به دلیل کپی کردن آرایه ورودی، تخصیص حافظه بیشتری نسبت به نسخه اصلی دارد.
🔻سپس، روش استفاده از Linq و کلاس Random با زمان اجرای بالاتر و تخصیص حافظه قابل توجه بالاتر نسبت به دو روش قبل - در رتبه سوم قرار دارد.
🔻و در نهایت، روش استفاده از Linq و GUID در میان چهار روش، در رتبه آخر قرار دارد و همچنین بالاترین تخصیص حافظه را دارد.
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
🔗 لینک مقاله در ویرگول
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
🔸رندم کردن آرایه با استفاده از 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 با استفاده از Tuple جابجا میشود. این کار تا زمانی ادامه پیدا میکند که count برابر ۱ شود. در نهایت، آرایه تغییر یافته را برمیگردانیم.
while (count > 1)
{
int i = Random.Shared.Next(count--);
(array[i], array[count]) = (array[count], array[i]);
}
این روش به صورت مستقیم روی آرایه ورودی عمل میکند و آن را برمیگرداند، در حالی که روشهای OrderBy یک کپی از آرایه را برمیگردانند.
🔻نسخه دیگر این الگوریتم به صورت زیر پیاده سازی میشود.
int count = array.Length;این روش تقریباً شبیه به روش قبلی است با این استثنا که از روش Array.Copy() برای کپی آرایه ورودی استفاده میکنیم. در بخش دیگری از متد، با متغیر arrayCopy کار میکنیم و پس از پایان کار آن را برمیگردانیم.
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;
💠 ملاحظات پرفورمنسی هنگام تصادفی سازی یک آرایه در C#
🔻روش الگوریتم Fisher-Yates تا حد زیادی بهترین عملکرد را دارد و در رتبه اول قرار دارد و تقریباً هیچ تخصیص حافظهای ندارد.
🔻نسخه اصلاح شده الگوریتم در رتبه دوم قرار دارد و به دلیل کپی کردن آرایه ورودی، تخصیص حافظه بیشتری نسبت به نسخه اصلی دارد.
🔻سپس، روش استفاده از Linq و کلاس Random با زمان اجرای بالاتر و تخصیص حافظه قابل توجه بالاتر نسبت به دو روش قبل - در رتبه سوم قرار دارد.
🔻و در نهایت، روش استفاده از Linq و GUID در میان چهار روش، در رتبه آخر قرار دارد و همچنین بالاترین تخصیص حافظه را دارد.
🔗 نسخه کامل این مقاله را میتوانید در اینجا مطالعه کنید.
🔗 لینک مقاله در ویرگول
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Code Maze
How to Efficiently Randomize an Array in C# - Code Maze
In this article, we'll explore several ways to randomize an array in C#. We'll see the most efficient way of doing this.
👍7🔥3❤2
آشنایی با Domain Validation
اعتبار سنجی دامنه، فرآیندی است برای بررسی اینکه «آیا داده ها و عملیات در مدل دامنه ما با قوانین تجاری و متغیرهای ثابت سازگار هستند یا خیر». به عنوان مثال، ممکن است بخواهیم اعتبار یک آدرس ایمیل معتبر باشد، یک نام خالی نباشد، یا اینکه سفارش انجام شده حداقل یک مورد انتخابی دارد.
1. Throw exception
یکی از راههای پیادهسازی اعتبار دامنه، استفاده از exception و زمانی است که اعتبارسنجی ناموفق است.
این رویکرد دارای معایبی است از جمله:
- استفاده از Throw exception گران است و میتواند بر عملکرد تاثیر بگذارد.
- استثناها باید برای موقعیتهای استثنایی استفاده شوند، نه برای سناریوهای اعتبارسنجی عادی.
2. Result object
یک راه بهتر برای پیاده سازی اعتبار دامنه، بازگشت شیء نتیجه به جای throw exception است. شیء نتیجه یک کلاس ساده است که نتیجه عملیاتی شامل یک پرچم موفقیت، یک مقدار و مجموعه ای از خطاها را در بر می گیرد.
این رویکرد چندین مزیت دارد، از جمله:
- برگرداندن یک شیء نتیجه، ارزانتر و سریعتر از پرتاب کردن استثناها است.
- اشیاء نتیجه میتوانند چندین خطا را در عملیات مدیریت کنند و نمایش آنها به کاربر یا ثبت آنها را آسانتر میکند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
اعتبار سنجی دامنه، فرآیندی است برای بررسی اینکه «آیا داده ها و عملیات در مدل دامنه ما با قوانین تجاری و متغیرهای ثابت سازگار هستند یا خیر». به عنوان مثال، ممکن است بخواهیم اعتبار یک آدرس ایمیل معتبر باشد، یک نام خالی نباشد، یا اینکه سفارش انجام شده حداقل یک مورد انتخابی دارد.
1. Throw exception
یکی از راههای پیادهسازی اعتبار دامنه، استفاده از exception و زمانی است که اعتبارسنجی ناموفق است.
این رویکرد دارای معایبی است از جمله:
- استفاده از Throw exception گران است و میتواند بر عملکرد تاثیر بگذارد.
- استثناها باید برای موقعیتهای استثنایی استفاده شوند، نه برای سناریوهای اعتبارسنجی عادی.
2. Result object
یک راه بهتر برای پیاده سازی اعتبار دامنه، بازگشت شیء نتیجه به جای throw exception است. شیء نتیجه یک کلاس ساده است که نتیجه عملیاتی شامل یک پرچم موفقیت، یک مقدار و مجموعه ای از خطاها را در بر می گیرد.
این رویکرد چندین مزیت دارد، از جمله:
- برگرداندن یک شیء نتیجه، ارزانتر و سریعتر از پرتاب کردن استثناها است.
- اشیاء نتیجه میتوانند چندین خطا را در عملیات مدیریت کنند و نمایش آنها به کاربر یا ثبت آنها را آسانتر میکند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
Domain Validation
In this blog post, I want to share with you how to implement domain validation by returning a result...
👍8
نگاهی عمیقتر به مفاهیم همزمانی در سیشارپ
در یک برنامه معمولی دستورات به ترتیب از بالا به پایین اجرا می شوند یعنی اجرای برنامه به صورت خطی از ابتدا تا انتها است.
موقعیتهایی وجود دارد که نیاز است تا تکههایی از کد به صورت همزمان اجرا شود. در این شرایط میتوان از Thread ها استفاده کرد. به شرط اینکه از منابع مشترکی استفاده نکنند!
اما استفاده از منابع مشترک برای اجرای Thread ها باعث چه مشکلی میشود؟
قابلیت Thread ها این امکان را به ما میدهد تا چندین کار را به صورت همزمان انجام دهیم.
آیا تاکنون در حین اجرای یک برنامه کامپیوتری به تعداد thread های اختصاص داده شده به برنامه دقت کرده اید؟
چرا بعضی از برنامهها تعداد Thread کمتری را مشغول میکند؟
"Deep Dive into async/await: How to Unlock the Full Potential of C# Concurrency"
اسم ورکشاپی هست که "مهران داودی" با هدف آموزش مفاهیم همزمانی به صورت عمیق بر گذار میکند.
🔗 تا کنون یک جلسه از این ورکشاپ برگزار شده است که در این لینک میتوانید ببینید.
در این جلسه با مفهوم Thread و چالشهای Shared Memory آشنا میشویم.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
در یک برنامه معمولی دستورات به ترتیب از بالا به پایین اجرا می شوند یعنی اجرای برنامه به صورت خطی از ابتدا تا انتها است.
موقعیتهایی وجود دارد که نیاز است تا تکههایی از کد به صورت همزمان اجرا شود. در این شرایط میتوان از Thread ها استفاده کرد. به شرط اینکه از منابع مشترکی استفاده نکنند!
اما استفاده از منابع مشترک برای اجرای Thread ها باعث چه مشکلی میشود؟
قابلیت Thread ها این امکان را به ما میدهد تا چندین کار را به صورت همزمان انجام دهیم.
آیا تاکنون در حین اجرای یک برنامه کامپیوتری به تعداد thread های اختصاص داده شده به برنامه دقت کرده اید؟
چرا بعضی از برنامهها تعداد Thread کمتری را مشغول میکند؟
"Deep Dive into async/await: How to Unlock the Full Potential of C# Concurrency"
اسم ورکشاپی هست که "مهران داودی" با هدف آموزش مفاهیم همزمانی به صورت عمیق بر گذار میکند.
🔗 تا کنون یک جلسه از این ورکشاپ برگزار شده است که در این لینک میتوانید ببینید.
در این جلسه با مفهوم Thread و چالشهای Shared Memory آشنا میشویم.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
Concurrency in C# - Session 1
در این سری ورکشاپها مهران داودی در مورد مفاهیم Concurrency, Parallel Programming و Asynchronous Programming به صورت بنیادین صحبت میکند. در این ویدئو با مفهوم Thread آشنا میشویم و سپس در مورد Shared Memory و چالشهای آن صحبت میکنیم.
مهران داودی
http…
مهران داودی
http…
👍16❤4🔥2
✏️ آشنایی و پیاده سازی Value Object
یک Value Object الگویی برای طراحی است که یک شیء تغییرناپذیر را با برابری بر اساس وضعیت آن نشان میدهد، نه هویت آن. به این معنی که دو Value Object با هم برابرند، در صورتی که بدون توجه به Reference، خواص و مقادیر یکسانی داشته باشند.
یک Value Object دارای این ویژگیها است:
- تغییرناپذیر است!
- هیچ هویتی ندارد، به این معنی که یک شناسه منحصر به فرد یا ارجاع به شی دیگری ندارد!
- مستقل است!
- قابل مقایسه است!
✏️ برای مشاهده جزئیات پیاده سازی Value Object و نحوه استفاده آن در EF اینجا را مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
یک Value Object الگویی برای طراحی است که یک شیء تغییرناپذیر را با برابری بر اساس وضعیت آن نشان میدهد، نه هویت آن. به این معنی که دو Value Object با هم برابرند، در صورتی که بدون توجه به Reference، خواص و مقادیر یکسانی داشته باشند.
یک Value Object دارای این ویژگیها است:
- تغییرناپذیر است!
- هیچ هویتی ندارد، به این معنی که یک شناسه منحصر به فرد یا ارجاع به شی دیگری ندارد!
- مستقل است!
- قابل مقایسه است!
✏️ برای مشاهده جزئیات پیاده سازی Value Object و نحوه استفاده آن در EF اینجا را مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
Value Object
What is a value object? A value object is a design pattern that represents an immutable...
👍8
مدیریت Exception با استفاده از فیلترها در مقایسه با میان افزارها
- میانافزار قبل و بعد از pipeline اجرای عملیات اجرا میشود، بنابراین نمیتواند به action context یا حالت مدل دسترسی داشته باشد.
- فیلترها در داخل pipeline اجرا میشوند، بنابراین به action context و model state دسترسی دارد و می تواند response status code و هدرها را قبل از اینکه در response stream نوشته شود تغییر دهد.
- فیلترها برای به دام انداختن exception که در actions رخ میدهند مناسب هستند.
- فیلترها به اندازه میانافزارها برای رسیدگی به خطا انعطاف پذیر نیستند
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
- میانافزار قبل و بعد از pipeline اجرای عملیات اجرا میشود، بنابراین نمیتواند به action context یا حالت مدل دسترسی داشته باشد.
- فیلترها در داخل pipeline اجرا میشوند، بنابراین به action context و model state دسترسی دارد و می تواند response status code و هدرها را قبل از اینکه در response stream نوشته شود تغییر دهد.
- فیلترها برای به دام انداختن exception که در actions رخ میدهند مناسب هستند.
- فیلترها به اندازه میانافزارها برای رسیدگی به خطا انعطاف پذیر نیستند
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
Globally Exception Handling using Exception Filters vs Middleware
In this blog post, I want to talk about using IExceptionFilter(IAsyncExceptionFilter) for globally...
👍7❤1
استفاده موثر و درست از 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
______
استفاده درست از 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
______
DEV Community
Robust use of HTTP Client
In this blog post, I will show you how to use HttpClient and DelegatingHandler in ASP.NET Core to...
👍10
نگاهی عمیقتر به مفاهیم همزمانی در سی شارپ
این تیکه از کد کنده، عبارتی که احتمالا در طول تجربه کاری خود به کرات شنیدهایم!
علت زمان بر بودن اجرای کد شما یا وجود کاری CPU bound مثل جمع یک تا یک میلیارد ، یا کار IO bound است مثل ارسال یک HTTP Request به ازای هر مشتری.
کارهای Cpu bound کاندیداهای مناسبی برای انجام همزمان کارها هستند.
در جلسه دوم این کارگاه به بررسی عمیق تفاوت کارهای CPU bound و IO Bound پرداخته شده و اینکه چه مکانیسمهای الگوریتمی متفاوتی برای مواجهه با آنها وجود دارد.
همچنین تفاوتهای مفاهیم Thread و Task را با عمق بیشتر بررسی کرده و با بررسی کدهای مختلف تفاوتهای ذاتی آنها و نحوه مواجهه .NET با آنها را شرح داده.
اگر برایتان جالب است که چه امکاناتی با اضافه شدن Task در اختیار برنامه نویس قرار گرفت ورکشاپ زیر را ببینید.
"Deep Dive into async/await: How to Unlock the Full Potential of C# Concurrency"
اسم کارگاهی هست که "مهران داودی" با هدف آموزش مفاهیم همزمانی به صورت عمیق بر گذار میکند.
تا کنون دو جلسه از این کارگاه برگزار شده است:
🔗 لینک ویدیوی جلسه اول
🔗 لینک ویدیوی جلسه دوم
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
این تیکه از کد کنده، عبارتی که احتمالا در طول تجربه کاری خود به کرات شنیدهایم!
علت زمان بر بودن اجرای کد شما یا وجود کاری CPU bound مثل جمع یک تا یک میلیارد ، یا کار IO bound است مثل ارسال یک HTTP Request به ازای هر مشتری.
کارهای Cpu bound کاندیداهای مناسبی برای انجام همزمان کارها هستند.
در جلسه دوم این کارگاه به بررسی عمیق تفاوت کارهای CPU bound و IO Bound پرداخته شده و اینکه چه مکانیسمهای الگوریتمی متفاوتی برای مواجهه با آنها وجود دارد.
همچنین تفاوتهای مفاهیم Thread و Task را با عمق بیشتر بررسی کرده و با بررسی کدهای مختلف تفاوتهای ذاتی آنها و نحوه مواجهه .NET با آنها را شرح داده.
اگر برایتان جالب است که چه امکاناتی با اضافه شدن Task در اختیار برنامه نویس قرار گرفت ورکشاپ زیر را ببینید.
"Deep Dive into async/await: How to Unlock the Full Potential of C# Concurrency"
اسم کارگاهی هست که "مهران داودی" با هدف آموزش مفاهیم همزمانی به صورت عمیق بر گذار میکند.
تا کنون دو جلسه از این کارگاه برگزار شده است:
🔗 لینک ویدیوی جلسه اول
🔗 لینک ویدیوی جلسه دوم
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#نگار_قاسمی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
YouTube
Concurrency in C# - Session 1
در این سری ورکشاپها مهران داودی در مورد مفاهیم Concurrency, Parallel Programming و Asynchronous Programming به صورت بنیادین صحبت میکند. در این ویدئو با مفهوم Thread آشنا میشویم و سپس در مورد Shared Memory و چالشهای آن صحبت میکنیم.
مهران داودی
http…
مهران داودی
http…
👍15❤6🔥3
آیا زمان استفاده از Blazor رسیده است؟
توسعه وب یک زمینه سریع و پویا است که در آن فناوریها و framework های جدید دائماً برای برآورده کردن نیازها و انتظارات کاربران و توسعهدهندگان پدیدار میشوند. در این پست ، سه چارچوب محبوب توسعه وب را با هم مقایسه خواهیم کرد: Blazor، Angular و React.
فریم ورک Blazor
فریم ورک Blazor برای ساخت برنامههای کاربردی وب تعاملی با استفاده از سی شارپ و دات نت است که به توسعه دهندگان این امکان را میدهد تا کدهای فرانتاند و بکاند را به یک زبان بنویسند و از ابزارهای مشابهی مانند Visual Studio و NET Core استفاده کنند. Blazor کد C# را در مرورگر با استفاده از WebAssembly، یک فرمت دستورالعمل باینری که میتواند توسط مرورگرهای وب مدرن اجرا شود، اجرا می کند. Blazor همچنین از رندر سمت سرور پشتیبانی می کند، جایی که کد C# بر روی سرور اجرا میشود و رابط کاربری از طریق SignalR به روز میشود.
فریم ورک Angular
فریم ورکAngular برای ساخت برنامههای کاربردی وب با استفاده از TypeScript میباشد و یک superset جاوا اسکریپت است که تایپ استاتیک و سایر ویژگیها را اضافه میکند. Angular از HTML به عنوان یک زبان قالب استفاده میکند و اتصال داده، تزریق وابستگی، مسیریابی، تست و سایر ویژگیها را ارائه میدهد. Angular کد TypeScript را با استفاده از موتورهای جاوا اسکریپت مانند V8 یا SpiderMonkey در مرورگر اجرا میکند.
فریم ورک React
فریم ورک React برای ساخت رابطهای کاربری با استفاده از جاوا اسکریپت و JSX است، یک syntax extension که امکان نوشتن عناصر HTML مانند در جاوا اسکریپت را فراهم می کند. React از یک DOM مجازی برای مدیریت وضعیت UI استفاده می کند و DOM واقعی را فقط در صورت لزوم به روز میکند. React همچنین از رندر سمت سرور پشتیبانی میکند، جایی که کد جاوا اسکریپت بر روی سرور اجرا میشود و HTML به مرورگر ارسال میشود.
آیا پروژه منبع باز برای شروع Blazor وجود دارد؟
بله، پروژه های منبع باز مبتنی بر Blazor در حال افزایش هستند. به عنوان مثال، Bitplatform یک گزینه عالی برای شروع کار شما است. آنها ادعا میکنند که در مقایسه با سایر فریم ورکها مانند Telerik، Syncfusion و موارد دیگر، کمترین اندازه فایل را دارند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
توسعه وب یک زمینه سریع و پویا است که در آن فناوریها و framework های جدید دائماً برای برآورده کردن نیازها و انتظارات کاربران و توسعهدهندگان پدیدار میشوند. در این پست ، سه چارچوب محبوب توسعه وب را با هم مقایسه خواهیم کرد: Blazor، Angular و React.
فریم ورک Blazor
فریم ورک Blazor برای ساخت برنامههای کاربردی وب تعاملی با استفاده از سی شارپ و دات نت است که به توسعه دهندگان این امکان را میدهد تا کدهای فرانتاند و بکاند را به یک زبان بنویسند و از ابزارهای مشابهی مانند Visual Studio و NET Core استفاده کنند. Blazor کد C# را در مرورگر با استفاده از WebAssembly، یک فرمت دستورالعمل باینری که میتواند توسط مرورگرهای وب مدرن اجرا شود، اجرا می کند. Blazor همچنین از رندر سمت سرور پشتیبانی می کند، جایی که کد C# بر روی سرور اجرا میشود و رابط کاربری از طریق SignalR به روز میشود.
فریم ورک Angular
فریم ورکAngular برای ساخت برنامههای کاربردی وب با استفاده از TypeScript میباشد و یک superset جاوا اسکریپت است که تایپ استاتیک و سایر ویژگیها را اضافه میکند. Angular از HTML به عنوان یک زبان قالب استفاده میکند و اتصال داده، تزریق وابستگی، مسیریابی، تست و سایر ویژگیها را ارائه میدهد. Angular کد TypeScript را با استفاده از موتورهای جاوا اسکریپت مانند V8 یا SpiderMonkey در مرورگر اجرا میکند.
فریم ورک React
فریم ورک React برای ساخت رابطهای کاربری با استفاده از جاوا اسکریپت و JSX است، یک syntax extension که امکان نوشتن عناصر HTML مانند در جاوا اسکریپت را فراهم می کند. React از یک DOM مجازی برای مدیریت وضعیت UI استفاده می کند و DOM واقعی را فقط در صورت لزوم به روز میکند. React همچنین از رندر سمت سرور پشتیبانی میکند، جایی که کد جاوا اسکریپت بر روی سرور اجرا میشود و HTML به مرورگر ارسال میشود.
آیا پروژه منبع باز برای شروع Blazor وجود دارد؟
بله، پروژه های منبع باز مبتنی بر Blazor در حال افزایش هستند. به عنوان مثال، Bitplatform یک گزینه عالی برای شروع کار شما است. آنها ادعا میکنند که در مقایسه با سایر فریم ورکها مانند Telerik، Syncfusion و موارد دیگر، کمترین اندازه فایل را دارند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
bit BlazorUI
Home - bit BlazorUI
home page of the bit blazorui components
👍9👎3🔥2❤1
اگه اکانت تلگرام پرمیوم دارین دکمه زیر رو بزنین تا کانال فلسفه نرمافزار رو بوست کنین...
ببینیم به حد نصاب میرسه تعداد پرمیوم دارامون!؟
(تلگرامتون باید آپدیت باشه که دکمش بیاد)
https://news.1rj.ru/str/SoftwarePhilosophy?boost
ببینیم به حد نصاب میرسه تعداد پرمیوم دارامون!؟
(تلگرامتون باید آپدیت باشه که دکمش بیاد)
https://news.1rj.ru/str/SoftwarePhilosophy?boost
Telegram
Software Philosophy
از این کانال حمایت کنید تا بتواند به قابلیتهای اضافی دسترسی پیدا کند.
❤1👍1🔥1
وراثت یا ترکیب Inheritance vs Composition، مسئله این است!
درک Inheritance
وراثت مفهومی اساسی در برنامه نویسی شی گرا (OOP) است که راهی برای ایجاد کلاسهای جدید از کلاسهای موجود است. وراثت زمانی مفید است که بخواهیم یک رابطه "is-a" بین کلاسها را مدل کنیم. به عنوان مثال، یک کلاس Dog میتواند از یک کلاس Animal ارث ببرد، زیرا سگ یک حیوان است.
زمان استفاده و عدم استفاده از Inheritance
زمانی که میخواهید یک رابطه "is-a" را مدل کنید، از وراثت استفاده کنید. به عنوان مثال، سگ نوعی خاص از حیوانات است. در چنین مواردی، وراثت میتواند منجر به کد پاک و شهودی شود. با این حال، معایبی نیز دارد. یکی از این معایب این است که وراثت یک رابطه محکم بین کلاسها ایجاد میکند، به این معنی که هر تغییری در کلاس والد میتواند بر کلاسهای فرزند تأثیر بگذارد.
اشکال دیگر این است که Inheritance میتواند منجر به تعمیم بیش از حد و سردرگمی شود. به عنوان مثال، اگر بخواهیم یک کلاس Bird ایجاد کنیم که از Animal ارث میبرد، چه میشود؟ آیا باید روشهای خوردن و خوابیدن را نیز به ارث ببریم؟ اگر بخواهیم یک کلاس پنگوئن بسازیم که از Bird به ارث میبرد چه؟ آیا باید متد Fly را هم به ارث ببریم؟
درک Compositin
ترکیب یکی دیگر از مفاهیم OOP است که در آن یک کلاس با ترکیب چندین شی از کلاسهای دیگر ساخته میشود. ترکیب بندی بر اساس ایده رابطه "has-a" بین طبقات است. به عنوان مثال، یک کلاس Car دارای یک کلاس Engine، یک کلاس Wheel، یک کلاس Door و غیره. Composition زمانی مفید است که بخواهیم اشیاء پیچیدهای را که از اشیاء سادهتری تشکیل شدهاند مدلسازی کنیم.
زمان استفاده و عدم استفاده از Composition
ترکیب روشی انعطافپذیر برای ایجاد کلاسهای جدید از کلاسهای موجود است، زمانی که میخواهید یک رابطه "has-a" را مدل کنید از ترکیب استفاده کنید. با این حال، معایبی نیز دارد. یکی از از این معایب این است که ترکیب می تواند منجر به تکرار کد و پیچیدگی شود.
به عنوان مثال، اگر بخواهیم یک کلاس Truck ایجاد کنیم که مشابه کلاس Car باشد، اما چرخهای بیشتری داشته باشد و موتور متفاوتی داشته باشد چه؟ آیا باید کد را از کلاس Car کپی و پیست کنیم و آن را اصلاح کنیم؟ اگر بخواهیم یک کلاس موتور سیکلت ایجاد کنیم که فقط دو چرخ و یک موتور متفاوت داشته باشد، چه؟ آیا باید یک کلاس جدید از ابتدا ایجاد کنیم؟
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
درک Inheritance
وراثت مفهومی اساسی در برنامه نویسی شی گرا (OOP) است که راهی برای ایجاد کلاسهای جدید از کلاسهای موجود است. وراثت زمانی مفید است که بخواهیم یک رابطه "is-a" بین کلاسها را مدل کنیم. به عنوان مثال، یک کلاس Dog میتواند از یک کلاس Animal ارث ببرد، زیرا سگ یک حیوان است.
زمان استفاده و عدم استفاده از Inheritance
زمانی که میخواهید یک رابطه "is-a" را مدل کنید، از وراثت استفاده کنید. به عنوان مثال، سگ نوعی خاص از حیوانات است. در چنین مواردی، وراثت میتواند منجر به کد پاک و شهودی شود. با این حال، معایبی نیز دارد. یکی از این معایب این است که وراثت یک رابطه محکم بین کلاسها ایجاد میکند، به این معنی که هر تغییری در کلاس والد میتواند بر کلاسهای فرزند تأثیر بگذارد.
اشکال دیگر این است که Inheritance میتواند منجر به تعمیم بیش از حد و سردرگمی شود. به عنوان مثال، اگر بخواهیم یک کلاس Bird ایجاد کنیم که از Animal ارث میبرد، چه میشود؟ آیا باید روشهای خوردن و خوابیدن را نیز به ارث ببریم؟ اگر بخواهیم یک کلاس پنگوئن بسازیم که از Bird به ارث میبرد چه؟ آیا باید متد Fly را هم به ارث ببریم؟
درک Compositin
ترکیب یکی دیگر از مفاهیم OOP است که در آن یک کلاس با ترکیب چندین شی از کلاسهای دیگر ساخته میشود. ترکیب بندی بر اساس ایده رابطه "has-a" بین طبقات است. به عنوان مثال، یک کلاس Car دارای یک کلاس Engine، یک کلاس Wheel، یک کلاس Door و غیره. Composition زمانی مفید است که بخواهیم اشیاء پیچیدهای را که از اشیاء سادهتری تشکیل شدهاند مدلسازی کنیم.
زمان استفاده و عدم استفاده از Composition
ترکیب روشی انعطافپذیر برای ایجاد کلاسهای جدید از کلاسهای موجود است، زمانی که میخواهید یک رابطه "has-a" را مدل کنید از ترکیب استفاده کنید. با این حال، معایبی نیز دارد. یکی از از این معایب این است که ترکیب می تواند منجر به تکرار کد و پیچیدگی شود.
به عنوان مثال، اگر بخواهیم یک کلاس Truck ایجاد کنیم که مشابه کلاس Car باشد، اما چرخهای بیشتری داشته باشد و موتور متفاوتی داشته باشد چه؟ آیا باید کد را از کلاس Car کپی و پیست کنیم و آن را اصلاح کنیم؟ اگر بخواهیم یک کلاس موتور سیکلت ایجاد کنیم که فقط دو چرخ و یک موتور متفاوت داشته باشد، چه؟ آیا باید یک کلاس جدید از ابتدا ایجاد کنیم؟
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
Inheritance or Composition, that is the question.
In this article, I want to explore the differences between two common object-oriented programming...
👍24❤1
ابهام زدایی از Concurrency و Racing Conditions
تعریف Concurrency:
همزمانی به توانایی یک سیستم کامپیوتری برای اجرای چندین کار یا فرآیند به طور همزمان اشاره دارد که ظاهراً در زمان همپوشانی دارند. همزمانی مفهوم گستردهتری است که موازیسازی را در بر میگیرد اما لزوماً نیازی به اجرای همزمان وظایف بر روی چندین هسته CPU ندارد. این در مورد مدیریت و زمان بندی وظایف متعدد به گونه ای است که بیشترین استفاده را از منابع موجود داشته باشد.
تعریف Racing Conditions:
یک Racing Conditions نوعی باگ مربوط به همزمانی است و زمانی رخ میدهد که چندین رشته یا پردازش به دادهها یا منابع مشترک دسترسی داشته باشند و نتیجه نهایی به زمان بندی یا ترتیب اجرا بستگی دارد. به عبارت دیگر، این یک "مسابقه" بین رشتهها برای دسترسی و اصلاح دادههای مشترک است و نتیجه میتواند غیرقابل پیش بینی و نادرست باشد.
روش های جلوگیری از Racing Conditions:
در .Net برای جلوگیری از شرایط مسابقه بین Thread ها میتوانید از lock , Semaphores, Mutexes یا Monitors استفاده کنید. در عمل، انتخاب بهترین گزینه به نیازهای خاص برنامه شما بستگی دارد. lock اغلب سادهترین و رایجترین مکانیسم همگام سازی برای مدیریت همزمانی در یک فرآیند واحد است. Mutexes و Semaphores برای سناریوهای همگام سازی پیچیدهتر شامل ارتباطات بین فرآیندی یا مدیریت منابع استفاده میشود. Monitors یک رویکرد شیگرا برای همگام سازی ارائه میدهند و مدیریت همگام سازی را در زمینه اشیا و روشها آسانتر میکند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
تعریف Concurrency:
همزمانی به توانایی یک سیستم کامپیوتری برای اجرای چندین کار یا فرآیند به طور همزمان اشاره دارد که ظاهراً در زمان همپوشانی دارند. همزمانی مفهوم گستردهتری است که موازیسازی را در بر میگیرد اما لزوماً نیازی به اجرای همزمان وظایف بر روی چندین هسته CPU ندارد. این در مورد مدیریت و زمان بندی وظایف متعدد به گونه ای است که بیشترین استفاده را از منابع موجود داشته باشد.
تعریف Racing Conditions:
یک Racing Conditions نوعی باگ مربوط به همزمانی است و زمانی رخ میدهد که چندین رشته یا پردازش به دادهها یا منابع مشترک دسترسی داشته باشند و نتیجه نهایی به زمان بندی یا ترتیب اجرا بستگی دارد. به عبارت دیگر، این یک "مسابقه" بین رشتهها برای دسترسی و اصلاح دادههای مشترک است و نتیجه میتواند غیرقابل پیش بینی و نادرست باشد.
روش های جلوگیری از Racing Conditions:
در .Net برای جلوگیری از شرایط مسابقه بین Thread ها میتوانید از lock , Semaphores, Mutexes یا Monitors استفاده کنید. در عمل، انتخاب بهترین گزینه به نیازهای خاص برنامه شما بستگی دارد. lock اغلب سادهترین و رایجترین مکانیسم همگام سازی برای مدیریت همزمانی در یک فرآیند واحد است. Mutexes و Semaphores برای سناریوهای همگام سازی پیچیدهتر شامل ارتباطات بین فرآیندی یا مدیریت منابع استفاده میشود. Monitors یک رویکرد شیگرا برای همگام سازی ارائه میدهند و مدیریت همگام سازی را در زمینه اشیا و روشها آسانتر میکند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
Demystifying Concurrency and Racing Conditions
Concurrency and Racing Conditions are two important concepts in .NET programming, especially when...
👍13❤2🔥1
تعریف اتمام کار چیست ( DoD - Definition of Done)؟
یکی از مفاهیم کلیدی در توسعه نرم افزار چابک، تعریف اتمام کار (DoD) است. DoD مجموعهای از معیارهایی است که یک User Story یا یک ویژگی قبل از اینکه کامل شده و آماده تولید در نظر گرفته شود باید آنها را رعایت کند. DoD کمک می کند تا اطمینان حاصل شود که کیفیت و عملکرد محصول با انتظارات ذینفعان سازگار و همسو است.
تعریف DoD بسته به زمینه و محدوده پروژه می تواند متفاوت باشد. با این حال، همیشه باید توسط همه اعضای تیم درگیر در فرآیند توسعه، مانند صاحبان محصول، مدیران پروژه، توسعه دهندگان و اعضای تیم QA، به صورت واضح مورد توافق قرار گیرد.
تعریف DoD ابزار قدرتمندی است که میتواند به بهبود کیفیت، کارایی و همکاری تیمهای توسعه نرم افزار چابک کمک کند. با داشتن یک DoD درست و ایدهآل، میتوانیم اطمینان حاصل کنیم که محصولات ارزشمندی را ارائه میدهیم که نیازها و انتظارات مشتریان ما را برآورده میکند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
یکی از مفاهیم کلیدی در توسعه نرم افزار چابک، تعریف اتمام کار (DoD) است. DoD مجموعهای از معیارهایی است که یک User Story یا یک ویژگی قبل از اینکه کامل شده و آماده تولید در نظر گرفته شود باید آنها را رعایت کند. DoD کمک می کند تا اطمینان حاصل شود که کیفیت و عملکرد محصول با انتظارات ذینفعان سازگار و همسو است.
تعریف DoD بسته به زمینه و محدوده پروژه می تواند متفاوت باشد. با این حال، همیشه باید توسط همه اعضای تیم درگیر در فرآیند توسعه، مانند صاحبان محصول، مدیران پروژه، توسعه دهندگان و اعضای تیم QA، به صورت واضح مورد توافق قرار گیرد.
تعریف DoD ابزار قدرتمندی است که میتواند به بهبود کیفیت، کارایی و همکاری تیمهای توسعه نرم افزار چابک کمک کند. با داشتن یک DoD درست و ایدهآل، میتوانیم اطمینان حاصل کنیم که محصولات ارزشمندی را ارائه میدهیم که نیازها و انتظارات مشتریان ما را برآورده میکند.
🔗 نسخه کامل مقاله به همراه نمونه کد را میتوانید در اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
What is the definition of done (DoD)
One of the key concepts in agile software development is the definition of done (DoD). The DoD is a...
👍3❤2
تعریف Azure Function
تابع Azure، یک راه حل بدون سرور است که به شما امکان میدهد تا کد کمتری بنویسید، زیرساخت کمتری را مصرف کنید و در هزینهها صرفه جویی کنید. تابع Azure قطعهای از کد است که در پاسخ به رویدادهای مختلف مانند درخواستهای HTTP، تایمرها، صفها، blobs و غیره اجرا میشود. شما میتوانید توابع Azure را در چندین زبان مانند C#، Java، JavaScript، PowerShell، Python و غیره بنویسید. همچنین میتوانید از ابزارهای مختلفی برای توسعه و اشکال زدایی توابع Azure استفاده کنید.
چه زمانی میتوانیم از تابع Azure استفاده کنیم؟
میتوانید از تابع Azure برای بسیاری از سناریوهایی که به event-driven logic و ادغام با سایر سرویسها نیاز دارند، استفاده کنید. به عنوان مثال، میتوانید از تابع Azure برای موارد زیر استفاده کنید:
- فرآیند آپلود فایل
- پردازش دادهها در زمان واقعی
- استنتاج بر روی مدلهای داده
- کارهای برنامه ریزی شده را اجرا کنید
- یک وب API مقیاس پذیر بسازید
- گردش کاری بدون سرور بسازید
- به تغییرات پایگاه داده پاسخ دهید
چگونه با درخواست HTTP یک تابع Azure ایجاد و راه اندازی کنیم؟
برای ایجاد یک تابع Azure با یک تریگر HTTP، باید این مراحل را دنبال کنید:
- یک function app در پورتال Azure یا با استفاده از Azure CLI ایجاد کنید. function app ظرفی است که میزبان یک یا چند عملکرد است.
- با استفاده از HTTP trigger template، یک تابع جدید در برنامه تابع ایجاد کنید. شما میتوانید C# را به عنوان زبان کد تابع خود انتخاب کنید.
- کد مورد نظر خود را در ویرایشگر کد بنویسید. میتوانید از کلاسهای HttpRequestData و HttpResponseData برای دسترسی به اشیاء درخواست و پاسخ HTTP استفاده کنید.
- با استفاده از پنل Test/Run یا با استفاده از curl یا Postman عملکرد خود را ذخیره و آزمایش کنید. میتوانید URL تابع خود را از قسمت Function URL کپی کنید.
🔗 نسخه کامل مقاله به همراه نمونه کد را اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
تابع Azure، یک راه حل بدون سرور است که به شما امکان میدهد تا کد کمتری بنویسید، زیرساخت کمتری را مصرف کنید و در هزینهها صرفه جویی کنید. تابع Azure قطعهای از کد است که در پاسخ به رویدادهای مختلف مانند درخواستهای HTTP، تایمرها، صفها، blobs و غیره اجرا میشود. شما میتوانید توابع Azure را در چندین زبان مانند C#، Java، JavaScript، PowerShell، Python و غیره بنویسید. همچنین میتوانید از ابزارهای مختلفی برای توسعه و اشکال زدایی توابع Azure استفاده کنید.
چه زمانی میتوانیم از تابع Azure استفاده کنیم؟
میتوانید از تابع Azure برای بسیاری از سناریوهایی که به event-driven logic و ادغام با سایر سرویسها نیاز دارند، استفاده کنید. به عنوان مثال، میتوانید از تابع Azure برای موارد زیر استفاده کنید:
- فرآیند آپلود فایل
- پردازش دادهها در زمان واقعی
- استنتاج بر روی مدلهای داده
- کارهای برنامه ریزی شده را اجرا کنید
- یک وب API مقیاس پذیر بسازید
- گردش کاری بدون سرور بسازید
- به تغییرات پایگاه داده پاسخ دهید
چگونه با درخواست HTTP یک تابع Azure ایجاد و راه اندازی کنیم؟
برای ایجاد یک تابع Azure با یک تریگر HTTP، باید این مراحل را دنبال کنید:
- یک function app در پورتال Azure یا با استفاده از Azure CLI ایجاد کنید. function app ظرفی است که میزبان یک یا چند عملکرد است.
- با استفاده از HTTP trigger template، یک تابع جدید در برنامه تابع ایجاد کنید. شما میتوانید C# را به عنوان زبان کد تابع خود انتخاب کنید.
- کد مورد نظر خود را در ویرایشگر کد بنویسید. میتوانید از کلاسهای HttpRequestData و HttpResponseData برای دسترسی به اشیاء درخواست و پاسخ HTTP استفاده کنید.
- با استفاده از پنل Test/Run یا با استفاده از curl یا Postman عملکرد خود را ذخیره و آزمایش کنید. میتوانید URL تابع خود را از قسمت Function URL کپی کنید.
🔗 نسخه کامل مقاله به همراه نمونه کد را اینجا مطالعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#محمدرضا_پازوکی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
DEV Community
What is Azure Function?
In this blog post, I will write about the Azure function, a serverless computing service that allows...
👍6❤4