Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
🔶 تغییرات 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
نگاهی عمیق‌تر به مفاهیم همزمانی در سی شارپ

این تیکه از کد کنده، عبارتی که احتمالا در طول تجربه کاری خود به کرات شنیده‌ایم!
علت زمان بر بودن اجرای کد شما یا وجود کاری 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

______
👍156🔥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

______
👍9👎3🔥21
اگه اکانت تلگرام پرمیوم دارین دکمه زیر رو بزنین تا کانال فلسفه نرم‌افزار رو بوست کنین...
ببینیم به حد نصاب می‌رسه تعداد پرمیوم دارامون!؟

(تلگرامتون باید آپدیت باشه که دکمش بیاد)
https://news.1rj.ru/str/SoftwarePhilosophy?boost
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

______
👍241
ابهام زدایی از Concurrency و Racing Conditions

تعریف Concurrency:
همزمانی
به توانایی یک سیستم کامپیوتری برای اجرای چندین کار یا فرآیند به طور همزمان اشاره دارد که ظاهراً در زمان همپوشانی دارند. همزمانی مفهوم گسترده‌تری است که موازی‌سازی را در بر می‌گیرد اما لزوماً نیازی به اجرای همزمان وظایف بر روی چندین هسته CPU ندارد. این در مورد مدیریت و زمان بندی وظایف متعدد به گونه ای است که بیشترین استفاده را از منابع موجود داشته باشد.

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

روش های جلوگیری از Racing Conditions:
در .Net برای جلوگیری از شرایط مسابقه بین Thread ها می‌توانید از lock , Semaphores, Mutexes یا Monitors استفاده کنید. در عمل، انتخاب بهترین گزینه به نیازهای خاص برنامه شما بستگی دارد. lock اغلب ساده‌ترین و رایج‌ترین مکانیسم همگام سازی برای مدیریت همزمانی در یک فرآیند واحد است. Mutexes و Semaphores برای سناریوهای همگام سازی پیچیده‌تر شامل ارتباطات بین فرآیندی یا مدیریت منابع استفاده می‌شود. Monitors یک رویکرد شی‌گرا برای همگام سازی ارائه می‌دهند و مدیریت همگام سازی را در زمینه اشیا و روش‌ها آسان‌تر می‌کند.

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

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

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

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

______
👍132🔥1
تعریف اتمام کار چیست ( DoD - Definition of Done)؟

یکی از مفاهیم کلیدی در توسعه نرم افزار چابک، تعریف اتمام کار (DoD) است. DoD مجموعه‌ای از معیارهایی است که یک User Story یا یک ویژگی قبل از اینکه کامل شده و آماده تولید در نظر گرفته شود باید آن‌ها را رعایت کند. DoD کمک می کند تا اطمینان حاصل شود که کیفیت و عملکرد محصول با انتظارات ذینفعان سازگار و همسو است.

تعریف DoD بسته به زمینه و محدوده پروژه می تواند متفاوت باشد. با این حال، همیشه باید توسط همه اعضای تیم درگیر در فرآیند توسعه، مانند صاحبان محصول، مدیران پروژه، توسعه دهندگان و اعضای تیم QA، به صورت واضح مورد توافق قرار گیرد.

تعریف DoD ابزار قدرتمندی است که می‌تواند به بهبود کیفیت، کارایی و همکاری تیم‌های توسعه نرم افزار چابک کمک کند. با داشتن یک DoD درست و ایده‌آل، می‌توانیم اطمینان حاصل کنیم که محصولات ارزشمندی را ارائه می‌دهیم که نیازها و انتظارات مشتریان ما را برآورده می‌کند.


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

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

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

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

______
👍32
تعریف 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

______
👍64
Forwarded from Arfa
Media is too big
VIEW IN TELEGRAM
به قول جادی : " Git خیییییلی بزرگه، من شک دارم خود توروالدز هم همه اش رو یادش باشه همیشه "

ولی دونستنش خیلی مهمه چون Git ابزاریه که به ما کمک میکنه بتونیم مثل چرخ دنده های ساعت خیلی روون و تمیز کنار هم کد بزنیم

این به کنار، وقتی میخوایم روی یه پروژه اوپن سورس مشارکت کنیم هم نیازه به Git مسلط باشیم

برای همن ما تصمیم گرفتیم تمام فرایند های اصلی‌ای که Git درش استفاده میشه رو در یه کارگاه عملی و رایگان مرور کنیم:

از 0 تا 100 توسعه یه فیچر یا رفع یه باگ
ریو کردنش
تستش
در نهایت بردنش رو پروداکشن

از طرفی برای 40 نفر از کسایی که دوس دارن اولین ( یا چندمین ) مشارکتشون در دنیای اوپن سورس رو انجام بدن یه تعداد تسک خیلی ساده ( در حد اصلاح یه کلمه ) آماده کردیم تا خیلی راحت اولین contribute شون رو انجام بدن

که فرصت خیلی خوبی برای hacktoberfest هم هست !

از همین پایین میتونی تو رویداد شرکت ( attend ) کنی. (کارگاه رایگان هست)
https://www.linkedin.com/events/gitworkshop7118506016878510080/theater/

اطلاع رسانی ها و ویدیو ضبط شده دوره رو توی این کانال تلگرامی میذاریم :
https://news.1rj.ru/str/hacktoberfest_fa
👍119🔥1
دستیار شخصی شما در پیش برد کارهای پس زمینه!

آیا تا به حال برایتان پیش آمده است که نیاز داشته باشید یک سری کارهای پس زمینه را در .Net هندل کنید؟
احتمالا نیاز داشته‌اید یک سری جاب را Schedule کنید تا در زمان‌های مشخصی کارهای مشخصی انجام دهند.

برای هندل کردن این کارها راه کار ساده و مفیدی وجود دارد به نام Hangfire. Hangfire فریم‌ورکی open-source است که به توسعه‌دهندگان در اجرای، تنظیم و مدیریت background tasks در هر برنامه‌ای .NET کمک می‌کند. Hangfire همچنین امکان پشتیبانی از هر دو ساختار .NET Framework و .NET Core را دارد.

جاب‌ها در Hangfire نسخه‌بندی می‌شوند، مجددا امتحان می‌شوند، در صف قرار می‌گیرند و بینworker های موجود توزیع می‌شوند. 

عملیات Hangfire  در چهار دسته‌ی نوبت دهی، اجرا، تلاش مجدد و نسخه سازی دسته بندی می‌شود.

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

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

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

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

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

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

______
👍11🔥54
سرویس‌های Azure Container:
راهنمای میزبانی Docker Images

اگر با docker کار می‌کنید و می‌خواهید آنها را در Azure مستقر کنید، ممکن است تعجب کنید که از کدام سرویس استفاده کنید. Azure چندین گزینه برای میزبانی docker images ارائه می‌دهد، مانند Container Registry، Container Instance، Container App و Web App for Containers.

سرویس Container Registry
سرویس Container Registry یک سرویس رجیستری خصوصی است که به شما امکان می‌دهد docker images های خود را در Azure ذخیره و مدیریت کنید. می‌توانید از آن برای push و pull کردن image ها از هر کلاینت داکر استفاده کنید یا آن را با سایر سرویس‌های Azure مانند Azure DevOps، Azure Kubernetes Service یا Azure Functions ادغام کنید.


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

سرویس Container App
سرویس Container App سرویس جدیدی است که به شما امکان می‌دهد برنامه های کانتینری را در Azure با حداقل پیکربندی و مدیریت اجرا کنید. می‌توانید docker های خود را در یک محیط بدون سرور مستقر کنید که به‌طور خودکار بر اساس تقاضا کاهش یا افزایش می‌یابد.

سرویس Web App for Containers
سرویس Web App for Containers سرویسی است که به شما امکان می‌دهد برنامه های وب را در Azure با استفاده از docker image اجرا کنید. می‌توانید image های خود را از Container Registry یا هر رجیستری دیگر deploy کنید و از ویژگی‌ها و ابزارهای مشابه برنامه‌های وب معمولی مانند دامنه‌های سفارشی، گواهی‌های SSL، اسلات‌های استقرار، پشتیبان‌گیری و تشخیص استفاده کنید.

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

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

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

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

______
👍7