3509
چکیدهای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرمافزار. معماری نوین نرمافزار، تکنولوژیهای برنامه نویسی جدید
صف (Queue)
#csharp_for_beginners
در برنامهنویسی، صف (Queue) یکی از مهمترین ساختارهای دادهای است که بر پایه اصل اول وارد، اول خارج (FIFO) عمل میکند. کلاس <Queue<T در فضای نام System.Collections.Generic در داتنت (#C) پیادهسازی این ساختار را به شکلی ساده و قدرتمند فراهم کرده است.
کلاس <Queue<T از فضای نام System.Collections.Generic استفاده میکند و برای کار با مجموعهای از عناصر از نوع مشخص (Generic) طراحی شده است. این کلاس در اسمبلی System.Collections.dll قرار دارد
ویژگیهای اصلی
FIFO (اول وارد، اول خارج): عناصر به انتهای صف اضافه میشوند و از ابتدای آن حذف میشوند.
جنریک: میتوانید نوع داده مورد نظر خود را هنگام ایجاد صف مشخص کنید.
کارایی بالا : استفاده بهینه از حافظه و سرعت مناسب برای صفهایی با حجم بالا.
متدها و اعضای مهم
• Enqueue
این متد برای افزودن یک عنصر به انتهای صف استفاده میشود.
• Dequeue
برای حذف و بازگرداندن اولین عنصر صف از این متد استفاده میشود. اگر صف خالی باشد، اجرای این متد منجر به بروز خطا میشود.
• Peek
این متد بدون حذف عنصر، فقط اولین عنصر صف را بازمیگرداند. در صورتی که صف خالی باشد، خطا ایجاد میشود.
• Count
این ویژگی تعداد عناصر موجود در صف را بازمیگرداند و فقط قابل خواندن است.
• Clear
تمام عناصر موجود در صف را حذف میکند و صف را به وضعیت خالی برمیگرداند.
• Contains
بررسی میکند که آیا یک عنصر خاص در صف وجود دارد یا خیر. مقدار برگشتی این متد یک مقدار منطقی (true یا false) است.
• ToArray
تمامی عناصر موجود در صف را به یک آرایه کپی میکند و آن را بازمیگرداند.
• TrimExcess
این متد برای بهینهسازی حافظه استفاده میشود و ظرفیت صف را به اندازه واقعی دادهها کاهش میدهد.
• GetEnumerator
این متد امکان پیمایش صف با استفاده از حلقهها و الگوهای تکرار را فراهم میکند
کاربردهای رایج
کلاس <Queue<T در سناریوهای متعددی کاربرد دارد؛ از جمله:
مدیریت نوبت در سیستمهای کاربرمحور
الگوریتمهای گراف مانند جستجوی سطحی (BFS)
صفهای پردازش پیام در سیستمهای توزیعشده
مدیریت وظایف پسزمینه در برنامههای چندنخی
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
پشته (Stack)
#csharp_for_beginners
در برنامهنویسی، ساختار دادهای پشته (Stack) یکی از رایجترین و کاربردیترین ساختارها برای مدیریت دادهها به شمار میرود. پشته بر اساس اصل LIFO (آخرین ورودی، اولین خروجی) عمل میکند. در چارچوب داتنت، کلاس Stack در فضای نام System.Collections برای این منظور طراحی شده است
معرفی کلاس Stack
کلاس Stack (نسخهٔ غیرجنریک) در فضای نام System.Collections قرار دارد و میتواند انواع مختلف دادهها (حتی null) را در خود نگه دارد. این کلاس با استفاده از نوع object، امکان ذخیرهٔ هر نوع دادهای را فراهم میکند
متدها و ویژگیهای اصلی
در این بخش مهمترین متدها و خواص کلاس Stack را بررسی میکنیم:
۱. Push(object obj)
افزودن یک عنصر به بالای پشته:
Stack stack = new Stack();
stack.Push("سلام");
stack.Push(123);
stack.Push(null);
object top = stack.Pop(); // آخرین مقدار افزودهشده را برمیگرداند
object top = stack.Peek();
int count = stack.Count;
stack.Clear();
bool hasHello = stack.Contains("سلام");
Stack myStack = new Stack();
myStack.Push("Hello");
myStack.Push("World");
myStack.Push(null);
Console.WriteLine($"تعداد: {myStack.Count}");
while (myStack.Count > 0)
Console.WriteLine(myStack.Pop());
تعداد: 3
null
World
Hello
آموزش گامبهگام دیباگ برنامههای C# در VS Code
#csharp_for_beginners
۱. معرفی ویدیویی
• این قسمت از مجموعه، مخصوص رفع مشکلات دیباگی که قبلاً ایجاد شدهاند در VS Code برای پروژههای سیشارپ است.
۲. مروری بر شرایط خطا
• تمرکز بر Conditional Breakpoints (نقاط توقف شرطی) است؛ زمانی مفید که میخواهید در شرایط خاصی اجرای برنامه متوقف شود.
• در ویدیو، نشان داده میشود که چگونه این شرطها گاهی به درستی کار نمیکنند (مثلاً خطاهایی که باعث نمیشوند نقطه توقف فعال شود یا شرایط نادیده گرفته میشود).
۳. تنظیم دقیق Breakpointها
• توضیح گامبهگام نحوه افزودن یک Breakpoint شرطی با وارد کردن یک شرط مثل x == 5.
• نمایش اینکه چطور میتوان شرط را اصلاح یا حذف کرد تا دوباره قابلاستفاده شود.
۴. اشکالات رایج
• ممکن است VS Code یا اکستنشنی که استفاده میکنید، شرط را نادیده بگیرد یا اجرا را ادامه دهد.
• روشهایی برای رفع این مشکل بررسی میشود، از جمله بهروزرسانی اکستنشن، تغییر پیکربندی launch.json، و راهاندازی مجدد جلسه دیباگ.
۵. ابزارهای کمکی و دیباگ پیشرفته
• اشاره به ویژگیهایی مثل Watch (مشاهده متغیرها) و Call Stack برای درک بهتر وضعیت اجرا.
• نمایش اینکه چطور Breakpoint را در کدی فعال کنیم که در چند مسیر اجرا ممکن است قابل رسیدن باشد.
۶. نکات پایانی
• توصیه به آزمایش Breakpointهای شرطی در سناریوهای سادهتر قبل از اعمال در کد پیچیده.
• تشویق به مطالعه مستندات VS Code و مراجع مایکروسافت برای رفع خطاهای ناشی از ناسازگاری نسخه یا پیکربندی اشتباه
🔗 ویدئوی کامل را اینجا مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
کار با دادههای JSON در SQL Server
فرمت JSON یک فرمت سبک و محبوب برای تبادل و ذخیره دادههای بدون ساختار است. از SQL Server 2016 به بعد، قابلیتهای بومی برای پردازش JSON در SQL Server، Azure SQL Database، Azure SQL Managed Instance، Azure Synapse Analytics و SQL Database در Microsoft Fabric وجود دارد. این یعنی ترکیبی از انعطاف NoSQL و قدرت دیتابیسهای رابطهای!
قابلیتهای کلیدی:
- استخراج مقادیر:
۱. قابلیت ISJSON: بررسی صحت فرمت JSON
۲. قابلیت JSON_VALUE: استخراج مقادیر اسکالر
۳. قابلیت JSON_QUERY: استخراج اشیاء یا آرایهها
۴. قابلیت JSON_MODIFY: ویرایش مقادیر JSON
- تبدیل JSON به ردیفها:
- با OPENJSON دادههای JSON را به جدول تبدیل کنید.
- نوع داده json:
- در SQL Server 2025 برای ذخیرهسازی و پردازش بهینهتر معرفی شده است.
- فرمتبندی خروجی به JSON:
- با FOR JSON نتایج کوئری را به فرمت JSON تبدیل کنید.
- ساخت اشیاء و آرایهها:
- توابع JSON_OBJECTAGG و JSON_ARRAYAGG برای تولید ساختارهای JSON.
کاربردها:
- سادهسازی مدلهای داده پیچیده
- مدیریت دادههای IoT، لاگها و REST API
- ذخیره JSON در ستونهای NVARCHAR با امکان ایندکسگذاری
---
تابع JSON_OBJECTAGG در Transact-SQL
این تابع به شما کمک میکند از دادههای SQL (ستونها، مقادیر یا نتایج تجمیعی) شیء JSON بسازید. زوجهای کلید/مقدار را دریافت میکند و خروجی استاندارد تحویل میدهد.
ویژگیها:
- استفاده در SELECT:
- قابل ترکیب با GROUP BY یا GROUPING SETS.
- ساخت آرایههای JSON:
- برای آرایه به جای شیء، از JSON_ARRAYAGG استفاده کنید.
- دسترسی:
- در Azure SQL Database، Azure SQL Managed Instance (با Always-up-to-date) و Fabric Data Warehouse در دسترس است.
مثالهای کدی
مثال ۱: ساخت شیء JSON از دادههای یک جدول
فرض کنید جدولی به اسم Employees داریم با ستونهای EmployeeID و Name. میخواهیم یک شیء JSON بسازیم که EmployeeID کلید و Name مقدار باشد.
SELECT JSON_OBJECTAGG(EmployeeID, Name) AS EmployeeJson
FROM Employees;
{
"1": "Ali Rezaei",
"2": "Sara Ahmadi",
"3": "Mohammad Hosseini"
}Orders داریم با ستونهای CustomerID و OrderAmount. میخواهیم برای هر مشتری مجموع سفارشات را به صورت JSON برگردانیم.SELECT CustomerID,
JSON_OBJECTAGG(OrderID, OrderAmount) AS OrderSummary
FROM Orders
GROUP BY CustomerID;
[
{"CustomerID": 101, "OrderSummary": {"Order1": 500, "Order2": 750}},
{"CustomerID": 102, "OrderSummary": {"Order3": 300}}
]
بررسی کامل انواع عددی صحیح (Integral Numeric Types) در زبان سی شارپ
#csharp_for_beginners
در زبان برنامهنویسی سی شارپ، انواع دادهای عددی صحیح (Integral Numeric Types) برای نمایش اعداد صحیح بدون قسمت اعشاری استفاده میشوند. این انواع دادهای بخش جداییناپذیری از عملیات ریاضی، شمارش، محاسبه شاخص آرایهها، و کنترل جریان برنامه هستند. در این مقاله با جزئیات کامل انواع دادهای صحیح، ویژگیها، تفاوتها و کاربردهای آنها آشنا خواهیم شد.
دستهبندی انواع عددی صحیح
انواع عددی صحیح در سی شارپ به دو دسته اصلی تقسیم میشوند:
۱. انواع علامتدار (Signed): میتوانند اعداد منفی و مثبت را نمایش دهند.
۲. انواع بدون علامت (Unsigned): فقط اعداد مثبت و صفر را پشتیبانی میکنند.
در جدول زیر، لیستی از انواع دادهای صحیح در سی شارپ به همراه ویژگیهای کلیدی آنها آمده است:
sbyte - 8 بیت
byte - 8 بیت
short - 16 بیت
ushort - 16 بیت
int - 32 بیت
uint - 32 بیت
long - 64 بیت
ulong - 64 بیت
nint - 32 یا 64 بیت (وابسته به معماری)
nuint - 32 یا 64 بیت (وابسته به معماری)
در سی شارپ میتوان از لیترالها برای مقداردهی مستقیم استفاده کرد. بهعنوان مثال:int a = 100;
uint b = 100u;
long c = 100L;
ulong d = 100UL;
int x = 123;
long y = x; // تبدیل ضمنی
long a = 1000L;
int b = (int)a; // تبدیل صریح
نوع دادهی bool در زبان برنامهنویسی سیشارپ
#csharp_for_beginners
در زبان برنامهنویسی سیشارپ، نوع دادهای bool یک نوع دادهی پایهای (Built-in Type) است که فقط میتواند یکی از دو مقدار true یا false را بپذیرد. این نوع داده نقش مهمی در کنترل جریان برنامه، تصمیمگیریها، حلقهها و بسیاری از عملیات منطقی ایفا میکند.
تعریف bool
در سیشارپ، bool یک کلمه کلیدی است که معادل کاملتر نوع System.Boolean از فضای نام System میباشد. این یعنی وقتی از bool استفاده میکنید، در واقع با یک شی از نوع System.Boolean کار میکنید:
bool isActive = true;
bool isComplete = false;
bool isLoggedIn = true;
if (isLoggedIn)
{
Console.WriteLine("Welcome back!");
}
else
{
Console.WriteLine("Please log in.");
}
bool hasUsername = true;
bool hasPassword = false;
if (hasUsername && hasPassword)
{
Console.WriteLine("Login successful.");
}
else
{
Console.WriteLine("Missing username or password.");
}
آشنایی با آرایهها در زبان سیشارپ
#csharp_for_beginners
در زبان برنامهنویسی سیشارپ، آرایهها یکی از ساختارهای دادهای پایه هستند که به برنامهنویسان اجازه میدهند مجموعهای از مقادیر با نوع یکسان را در یک ساختار ذخیرهسازی کنند. استفاده از آرایهها باعث سازماندهی بهتر دادهها و دسترسی سریعتر به اطلاعات میشود. در این مقاله به معرفی انواع آرایهها، نحوه تعریف و استفاده از آنها در سیشارپ میپردازیم.
تعریف آرایه
آرایه در سیشارپ شیئی است که شامل عناصر متعددی از یک نوع مشخص میباشد. هنگام تعریف آرایه، باید نوع دادهای عناصر و تعداد آنها را مشخص کنیم. بهعنوان مثال:
csharpCopyEditint[] numbers = new int[5];
csharpCopyEditstring[] names = { "Ali", "Sara", "Reza" };
csharpCopyEditdouble[] prices = new double[10];
csharpCopyEditint[,] matrix = new int[3, 4]; // یک ماتریس ۳ در ۴
csharpCopyEditint[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[3];
jaggedArray[1] = new int[5];
csharpCopyEditnumbers[0] = 10;
Console.WriteLine(numbers[0]);
نوع داده char در زبان سیشارپ
#csharp_for_beginners
در زبان برنامهنویسی #C، نوع دادهای char نمایانگر یک واحد کد UTF-16 یونیکد است که معمولاً به عنوان یک کاراکتر UTF-16 شناخته میشود. کلمه کلیدی char در #C معادل ساختار System.Char در .NET است.
ویژگیهای کلیدی نوع char:
محدوده مقادیر: از U+0000 تا U+FFFF
اندازه: 16 بیت
مقدار پیشفرض: \0 یا U+0000
عملگرهای پشتیبانیشده برای char:
مقایسهای: مانند == و !=
افزایشی و کاهشی: مانند ++ و --
عملگرهای حسابی و بیتی: این عملگرها بر روی کد پوینتهای مربوطه عمل کرده و نتیجه را به صورت مقدار int ارائه میدهند.
تبدیل نوع char:
تبدیل ضمنی به انواع عددی: char به طور ضمنی قابل تبدیل به انواع عددی صحیح مانند ushort، int، uint، long، ulong، nint و nuint است. همچنین، به انواع عددی اعشاری مانند float، double و decimal نیز قابل تبدیل است.
تبدیل صریح از انواع دیگر به char: تبدیل از سایر انواع به char به
صورت صریح انجام میشود.
مثالهایی از مقداردهی به char:
var chars = new[]
{
'j',
'\u006A', // استفاده از توالی فرار یونیکد
'\x006A', // استفاده از توالی فرار هگزادسیمال
(char)106, // تبدیل عدد صحیح به char
};
Console.WriteLine(string.Join(" ", chars)); // خروجی: j j j j
پشتیبانی از عملگر LeftJoin در NET 10.
در نسخه جدید NET 10.، پشتیبانی بومی از عملگر LeftJoin در LINQ به این فریمورک اضافه شده است. این تغییر مهم در زمان نوشتن کوئریها در Entity Framework Core (EF Core) به شما کمک میکند تا کد سادهتری بنویسید و از پیچیدگیهای قبلی که نیازمند استفاده از ترکیب چندین متد مانند SelectMany و GroupJoin بود، رهایی یابید.
قبل از NET 10.:
در نسخههای قبلی EF Core، برای استفاده از عملیات LeftJoin نیاز به ترکیب چندین متد پیچیده بود. در این روش، ابتدا با استفاده از GroupJoin دادهها را به هم پیوند میدادیم، سپس از SelectMany و DefaultIfEmpty برای شبیهسازی رفتار LeftJoin استفاده میکردیم.
مثال کد قبل از NET 10.:
var query = students
.GroupJoin(
departments,
student => student.DepartmentID,
department => department.ID,
(student, departmentList) => new { student, subgroup = departmentList })
.SelectMany(
joinedSet => joinedSet.subgroup.DefaultIfEmpty(),
(student, department) => new
{
student.student.FirstName,
student.student.LastName,
Department = department.Name ?? "[NONE]"
});
LeftJoin در NET 10.، نوشتن کوئریها بسیار سادهتر و خواناتر شده است. دیگر نیازی به استفاده از ترکیب چندین متد نخواهید داشت، بلکه میتوانید به راحتی از این متد جدید استفاده کنید.var query = context.Students
.LeftJoin(
context.Departments,
student => student.DepartmentID,
department => department.ID,
(student, department) => new
{
student.FirstName,
student.LastName,
Department = department.Name ?? "[NONE]"
});
LeftJoin را انجام دهید.LeftJoin به شکل بهینهتری در پایگاه داده اجرا میشود.
نگاهی کمی فلسفیتر به MCP
مفهوم MCP بحث داغ این روزهای دنیای هوش مصنوعی است.
با نگاهی خاص میتوان گفت که MCP میتواند همان تاثیری را در دنیای هوشمصنوعی بگذارد که REST بر دنیای وب گذاشت.
در این مقاله جالب که به مقایسه این دو تکنولوژی و کارکردهایشان پرداخته، مفهوم Discovery را هم بررسی کرده که در حال حاضر بخشی از استاندارد REST نیست ولی MCP این فیچر را دارا است.
به نظرم من نقطه نظر نویسنده این مقاله در این مورد خیلی جالب است. قبلا هم در دنیای وب تکنولوژیها و پروتکلهایی وجود داشت که Discovery هم داشتند، ولی از آنجایی که معمولا هیچ برنامهنویسی از آن ویژگیها استفاده نمیکرد زیاد مورد استقبال قرار نگرفت.
ولی در دنیای هوشمصنوعی، ایجنتهای هوشمصنوعی استفاده بسیار زیادی از این ویژگی میکنند.
🔗 پیشنهاد میکنم حتما این مقاله جذاب رو بخونین.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
میدونستین راز ساختن محصولات #ai روی #dotnet در مفاهیم IChatClient و Microsoft.Extentions.AI است؟
فردا تو این لایو لیندکین قراره در مورد اینا صحبت کنم.
میبینمتون.
#cs_internship
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
انواع عددی صحیح (Integral Numeric Types) در سی شارپ
#csharp_for_beginners
در زبان برنامهنویسی C#، انواع عددی صحیح (Integral Numeric Types) برای نمایش اعداد صحیح به کار میروند. این انواع دادهای بهعنوان نوعدادههای مقداری (Value Types) شناخته میشوند و از عملیاتهای حسابی، منطقی بیتی، مقایسهای و تساوی پشتیبانی میکنند
▫️در C#، انواع دادهای عددی صحیح شامل موارد زیر هستند:
نوع sbyte: از مقدار ۱۲۸- تا ۱۲۷ را در ۸ بیت ذخیره میکند و معادل System.SByte در .NET است.
نوع byte: از مقدار ۰ تا ۲۵۵ را در ۸ بیت ذخیره میکند و معادل System.Byte است.
نوع short: از مقدار ۳۲۷۶۸- تا ۳۲۷۶۷ را در ۱۶ بیت ذخیره میکند و معادل System.Int16 است.
نوع ushort: از مقدار ۰ تا ۶۵۶۳۵ را در ۱۶ بیت ذخیره میکند و معادل System.UInt16 است.
نوع int: از مقدار -2,147,483,648 تا 2,147,483,647 را در 32 بیت ذخیره میکند و معادل System.Int32 است.
نوع uint: از مقدار ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵ را در ۳۲ بیت ذخیره میکند و معادل System.UInt32 است.
نوع long: از مقدار -9,223,372,036,854,775,808 تا 9,223,372,036,854,775,807 را در 64 بیت ذخیره میکند و معادل System.Int64 است.
نوع ulong: از مقدار ۰ تا ۱۸,۴۴۶,۷۴۴,۰۷۳,۷۰۹,۵۵۱,۶۱۵ را در ۶۴ بیت ذخیره میکند و معادل System.UInt64 است.
نوع nint: اندازهای وابسته به پلتفرم دارد (در سیستمهای ۳۲ بیتی، ۳۲ بیت و در سیستمهای ۶۴ بیتی، ۶۴ بیت است) و معادل System.IntPtr میباشد.
نوع nuint: مانند nint، اندازهای وابسته به پلتفرم دارد و معادل System.UIntPtr است.
این انواع دادهای برای ذخیره اعداد صحیح استفاده میشوند و بسته به نیاز حافظه و محدوده مقادیر مورد نظر انتخاب میشوند
مقادیر پیشفرض: مقدار پیشفرض برای تمامی انواع عددی صحیح، صفر (0) است.
حداقل و حداکثر مقادیر: هر نوع دادهای دارای ویژگیهای MinValue و MaxValue است که به ترتیب حداقل و حداکثر مقدار قابلپذیرش را نشان میدهند.
انواع با اندازه وابسته به پلتفرم: انواع nint و nuint به اندازه پلتفرم وابسته هستند؛ یعنی در فرآیندهای ۳۲ بیتی بهصورت ۳۲ بیتی و در فرآیندهای ۶۴ بیتی بهصورت ۶۴ بیتی عمل میکنند.
انواع بدون مرز: برای نمایش اعداد صحیح با اندازه نامحدود، میتوان از ساختار System.Numerics.BigInteger استفاده کرد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
درک انواع دادهها در سیشارپ
#csharp_for_beginners
در دنیای C#، درک تفاوتهای بین انواع دادهها برای برنامهنویسی مؤثر بسیار مهم است. این مقاله به بررسی تفاوتهای بین انواع دادههای decimal، double و float میپردازد و بر دقت، صحت و تأثیرات عملکردی آنها تمرکز میکند.
دقت (Precision): به نزدیکی اندازهگیریها اشاره دارد. به عنوان مثال، اگر یک مقدار را چندین بار اندازهگیری کنیم و نتیجه یکسانی بگیریم، نشاندهنده دقت بالا است.
صحت (Accuracy): نشاندهنده نزدیکی یک اندازهگیری به یک استاندارد شناخته شده است. یک اندازهگیری که از مقدار واقعی دور است، نادرست تلقی میشود.
دقت حسابی (Arithmetic Precision): به تعداد ارقام استفاده شده برای نمایش یک عدد اشاره دارد. ارقام بیشتر به معنای دقت بالاتر است.
تایپ decimal
دقت: دقت بالا (28-29 رقم معنادار).
موارد استفاده: ایدهآل برای محاسبات مالی که در آن دقت بسیار مهم است.
عملکرد: به دلیل نمایندگی پایه 10، کندتر از double و float است.
تایپ double
دقت: دقت متوسط (15-16 رقم معنادار).
موارد استفاده: مناسب برای محاسبات علمی که در آن عملکرد مهمتر از دقت است.
عملکرد: به دلیل نمایندگی پایه 2، سریعتر از decimal است.
تایپ float
دقت: دقت پایین (7 رقم معنادار).
موارد استفاده: در برنامههایی که صرفهجویی در حافظه مهمتر از دقت است، مانند گرافیک، استفاده میشود.
عملکرد: مشابه double است اما با دقت کمتر.
مقایسه عملکرد
هنگام مقایسه عملکرد این انواع داده، مشخص میشود که:
تایپ Double سریعترین است و برای برنامههایی که به محاسبات سریع نیاز دارند، مناسب است.
تایپ Decimal کندترین است اما بالاترین دقت را ارائه میدهد و برای برنامههای مالی ایدهآل است.
تایپ Float تعادلی بین سرعت و استفاده از حافظه ارائه میدهد اما دقت را فدای آن میکند.
🔗 ویدئو را از اینجا میتوانید ببیند.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
۱۰ برابر شدن سرعت TypeScript با پورت کامپایلر به GO
در این ویدئو Andres Hejlsberg (خالق تایپاسکریپت و سیشارپ) توضیح میدهد که چگونه با پورت کردن کدهای کامپایلر TypeScript به GO، سرعت کامپایل را 10x بهتر کردهاند!
او همچنین توضیح میدهد که چرا زیرساخت JavaScript برای این کار مناسب نیست. در حقیقت این زبان بیشتر برای کارهای UI طراحی شده بوده و زیرساختهای لازم برای کارهای performance-intensive مانند این کار را ندارد.
برای من خیلی جالب بود خالق سیشارپ، زبان GO را برای این کار انتخاب کرده، پس مستندات مربوط به این تصمیم را خواندم.
https://github.com/microsoft/typescript-go/discussions/411
اولین نکته جالب این بود که چقدر بدون تعصب و با ذهن باز زبانهای مختلف رو بررسی کردن.
با توجه به اینکه هر دو زبان C#, GO از لحاظ پرفورمنسی بسیار خوب هستند، یکی از مهمترین دلایل انتخاب GO تشابه بسیار بالای سینتکس آن با TypeScript بوده است.
کامپایلر قبلی تایپاسکریپت، با خود تایپاسکریپت نوشته شده و تیم نمیخواستند که کل آن را بازنویسی کنند.
در حقیقت هدف rewrite کردن نبوده، بلکه port کردن بوده.
آنها دنبال پورت کردن آن به یک زبان با پرفورمنس بالا بودند که تشابه سینتکسی بالایی داشته باشد تا عملیات پورت بتواند راحتتر انجام شود.
از بین زبانهای C#, GO و Rust، زبان گو تشابه سینتکسی بیشتری با تایپاسکریپت داشته و در نهایت انتخاب شده.
به نظرم نحوه انتخاب زبان برای این کار توسط خالق سیشارپ و تایپاسکریپ، درسهای تکنیکال و بیزسنی زیادی برای یاد گرفتن داره. نظر شما چیه؟
https://www.youtube.com/watch?v=pNlq-EVld70
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
ظهور #InstructUI برای ساخت #ui با #ai برای #blazor !!!
این ویدئوی ۵ دقیقهای نشان میدهد که چطور میتوانید با چت کردن صفحات مورد نظر خود را بسازید و خروجی لایو آن را ببینید.
محصول جدیدی نیست و قبلا مشابه آن وجود داشته، اما جذابیت این یکی تولید خروجی روی #blazor و #webassembly به جای #react و #javascript هست.
دنیای #بلیزر و #وباسمبلی خیلی دنیای جالبی داره میشه و به نظر آینده خیلی خوبی داره در چند سال آینده.
https://www.youtube.com/watch?v=4PiIx4TPgbw
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
✅ دوستان خوب و عزیزم سلام، من و تیم خوبم در #رسمیو، مدتی رو سرمون خلوت خواهد بود و دوست داریم به شکل مشاوره یا همکاری در انجام پروژه های شما (به صورت صفر تا صد یا مشارکت در پیاده سازی بخشی از سرویس هاتون) همراه باشیم .
✅ ما توی تیممون به جز توسعه دهندگان .net و React ، پروداکت منیجر و دیزاینر هم داریم اگر لازم داشته باشید برای این پروژه ها.
✅ کد تمیز و قابل گسترش مینویسیم، با هم سر استانداردهای مستندسازی به تفاهم خواهیم رسید.
✅ بعد از پایان پروژه هم، پروژه رو به تیم تون تحویل میدیم و اگر نیاز به آموزشی باشه، در حد توان راهنمایی و آموزش نیروهاتون رو هم بر عهده خواهیم گرفت.
خیلی به من لطف خواهید کرد اگر این پست را در همه ی گروه های فنی و بیزنسی تان منتشر کنید.
متاسفانه فعلا فقط از طریق اکانت تلگرام @StartupNerd وشماره 09308282925 در خدمت شما و پاسخگو خواهم بود.
🫂 مجددا از شما خواهش میکنم این پست رو (در همه ی گروه های خودتون که فکر میکنید ممکنه کسی به توانایی ما نیاز داشته باشه) بازنشر کنید
معرفی کلاس <List<T در سیشارپ
#csharp_for_beginners
در زبان برنامهنویسی سیشارپ، مجموعهها (Collections) نقش بسیار مهمی در مدیریت دادهها ایفا میکنند. یکی از رایجترین و پرکاربردترین مجموعههای عمومی، کلاس <List<T است که در فضای نام System.Collections.Generic قرار دارد. این کلاس، یک لیست عمومی (Generic List) است که امکان ذخیرهسازی، دسترسی و مدیریت مجموعهای از عناصر از نوع مشخصشده را فراهم میکند.
تعریف کلی
public class List<T> : System.Collections.Generic.IList<T>,
System.Collections.Generic.ICollection<T>,
System.Collections.Generic.IEnumerable<T>,
System.Collections.IList,
System.Collections.ICollection,
System.Collections.IEnumerable
List<string> names = new List<string>();
names.Add("Ali");
names.Add("Sara");
names.Add("Reza");
foreach (string name in names)
{
Console.WriteLine(name);
}
کلاس List<T> دارای چند سازنده برای ایجاد لیست است:
• List<T>()
ایجاد یک لیست خالی.
• List<T>(IEnumerable<T>)
ایجاد لیست با استفاده از مجموعهای دیگر.
• List<T>(int capacity)
تعریف ظرفیت اولیه لیست
—————————————————————
طراحی، توسعه و انتشار یک وباپ با استفاده از هوش مصنوعی
هوش مصنوعی در حال تغییر نحوهی طراحی و توسعهی وباپلیکیشنهاست و اکنون میتوان کل فرآیند را از ایده تا انتشار تنها با کمک ابزارهای مبتنی بر هوش مصنوعی انجام داد. این تحول به طراحان و توسعهدهندگان اجازه میدهد تا بدون نیاز به مهارتهای عمیق برنامهنویسی، اپلیکیشنهایی حرفهای ایجاد کنند. در این مقاله، سه مرحلهی کلیدی برای طراحی، توسعه و انتشار یک وباپ تنها با استفاده از هوش مصنوعی بررسی شده است.
اولین مرحله، ایجاد یک ایده و طراحی رابط کاربری با استفاده از ابزارهای هوش مصنوعی مانند Figma و Uizard است. این ابزارها میتوانند از طریق توصیف متنی یا تصاویر ورودی، طرحهای اولیه را ایجاد کنند و به کاربران کمک کنند تا بدون نیاز به مهارت طراحی پیچیده، یک رابط کاربری مناسب بسازند. برخی از این ابزارها همچنین امکان پیشنهاد تغییرات و بهینهسازی طراحی را بر اساس بهترین شیوههای UX ارائه میدهند.
پس از طراحی، مرحلهی توسعه آغاز میشود که در آن هوش مصنوعی میتواند کدهای موردنیاز را تولید کند. ابزارهایی مانند ChatGPT (با قابلیت کدنویسی)، GitHub Copilot و Replit به کاربران امکان میدهند تا کدهای HTML، CSS، و JavaScript را تنها از طریق دستورات متنی ایجاد کنند. این فرایند باعث کاهش نیاز به دانش عمیق کدنویسی شده و توسعهی وباپلیکیشنها را برای افراد بیشتری قابلدسترس میکند.
پس از تولید کد، گام بعدی تست و بهینهسازی اپلیکیشن است. ابزارهای تست خودکار مبتنی بر هوش مصنوعی مانند Testim و Applitools میتوانند به سرعت باگها و مشکلات احتمالی را شناسایی کنند. این ابزارها، با استفاده از یادگیری ماشینی، میتوانند پیشنهاداتی برای بهبود عملکرد، امنیت و سازگاری وباپ ارائه دهند. این مرحله از اهمیت ویژهای برخوردار است، زیرا کیفیت محصول نهایی را تضمین میکند.
در نهایت، فرآیند انتشار و میزبانی وباپ نیز میتواند بهطور کامل توسط ابزارهای هوش مصنوعی انجام شود. پلتفرمهایی مانند Vercel و Netlify امکان استقرار خودکار را فراهم کرده و میتوانند بهینهسازیهایی مانند بارگذاری سریعتر صفحات و بهبود عملکرد سئو را پیشنهاد دهند. علاوه بر این، برخی ابزارهای هوش مصنوعی میتوانند توصیههایی برای ارتقای تجربهی کاربری و بهبود تعاملات کاربران ارائه کنند.
این تحول نشان میدهد که هوش مصنوعی نه تنها فرآیند طراحی و توسعه را سریعتر و آسانتر کرده، بلکه دسترسی به توسعهی وب را برای افراد بیشتری ممکن ساخته است. در گذشته، ساخت یک وباپلیکیشن نیاز به تیمهای تخصصی داشت، اما امروزه افراد میتوانند با ترکیب ابزارهای هوش مصنوعی، بهتنهایی یک محصول کامل را از ابتدا تا انتها توسعه دهند.
در حالی که این فناوری فرصتهای بزرگی ایجاد کرده است، همچنان چالشهایی مانند وابستگی بیش از حد به هوش مصنوعی، محدودیتهای سفارشیسازی و نیاز به کنترل کیفی انسانی وجود دارد. با این حال، آیندهی طراحی و توسعهی وباپلیکیشنها به وضوح به سمت خودکارسازی بیشتر حرکت میکند و طراحان و توسعهدهندگانی که از این ابزارها به درستی استفاده کنند، میتوانند بهرهوری خود را به طرز چشمگیری افزایش دهند.
🔗 برای مطالعه کامل مقاله میتوانید به این لینک مراجعه کنید.
(مدت زمان مطالعه: ۴ دقیقه)
گردآورنده: فاطمه حیدری
#طراحی_محصول
#AI
@Dexign فلسفه دیزاین
______
آشنایی با کلاسها در زبان برنامهنویسی سی شارپ
#csharp_for_beginners
در زبان برنامهنویسی سی شارپ، کلاسها (Classes) یکی از اصلیترین اجزای برنامهنویسی شیءگرا هستند. کلاسها ساختارهایی هستند که به برنامهنویس اجازه میدهند اشیاء (Objects) را تعریف کرده و رفتار و دادههای آنها را سازماندهی کنند. این مفهوم به ما کمک میکند تا برنامههایی ماژولار، قابل نگهداری و قابل گسترش بنویسیم.
تعریف کلاس
یک کلاس در سی شارپ مانند یک الگو یا قالب است. این قالب ویژگیها (Properties) و رفتارها (Methods)یی را تعریف میکند که یک شیء از آن کلاس میتواند داشته باشد. برای مثال، اگر بخواهیم یک کلاس به نام Car تعریف کنیم، میتوانیم ویژگیهایی مانند Color یا Speed و رفتارهایی مانند Drive() یا Stop() برای آن مشخص کنیم.
مثال سادهای از تعریف کلاس:
public class Car
{
public string Color;
public int Speed;
public void Drive()
{
Console.WriteLine("Driving...");
}
}
Car myCar = new Car();
myCar.Color = "Red";
myCar.Drive();
public class Car
{
public string Color;
// سازنده
public Car(string color)
{
Color = color;
}
}
Car myCar = new Car("Blue");
public class Vehicle
{
public void Start() => Console.WriteLine("Starting...");
}
public class Car : Vehicle
{
public void Drive() => Console.WriteLine("Driving...");
}
چرا میگن «C# is Java done right»؟
هر دو زبان جاوا و سیشارپ زبانهای خیلی قدرتمندی هستن و در پروژههای بزرگی استفاده میشن.
از طرفی باید قبول کرد که از لحاظ syntax، زبان سیشارپ پیشرفتهتر و خوشدستتر است.
این ویدئو ویژگیهای مهمی که در سیشارپ بهتر پیادهسازی شدن و باعث میشه زبان مدرنتری حساب بشه رو توضیح میده.
از معروفترین تفاوتها، پیادهسازی ناقص Generic ها در جاوا و پیادهسازی خوبش در سیشارپ است.
ویژگی Property و Async/Await هم یکی از ویژگیهای خیلی مهمه که مدتهاست در سیشارپ وجود داره.
همینطور LINQ ویژگی خیلی جذابیه که پیادهسازی مشابهش تو جاوا هم خیلی دیرتر اضافه شد، و هم اینکه به خوشدستی پیادهسازی سیشارپ نیست.
🔗 تو این ویدئوی کوتاه این تفاوتها رو خیلی واضحتر و لذتبخشتر توضیح داده.
نظر شما در مورد این دو تا زبان چیه؟
#java #csharp #dotnet
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
ابزار string visualizer در ویژوال استودیو
یکی از دم دستترین امکانات #visualstudio ابزار string visualizer است. به محض اینکه موس روی متغیری قرار بگیره، این ابزار مقدار string اون متغییر رو نشون میده.
خب تا اینجا که چیزی نیست!
ابزار string visualizer یه امکان مفید و بسیار کاربردی داره که شاید تا به حال خیلی بهش دقت نکرده باشید. شما میتونید نوع string visualizer خودتون رو از قسمت string manipulation انتخاب کنید. مثلا اگه مقدارش یه JWT بود، میتونید مقدار Decode شده JWT رو مشاهده کنید.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
قابلیتهای جدید Data Annotations در دات نت ۸
در نسخه جدید NET 8.، ویژگیهای Data Annotations پیشرفتهای قابل توجهی داشتهاند. این ویژگیها، کدنویسی معتبرسازی دادهها را بسیار سادهتر و تمیزتر کرده است. در ادامه به صورت گام به گام این ویژگیهای جدید را بررسی میکنیم:
۱. ویژگی Length
این Annotation برای مشخص کردن حداقل و حداکثر طول رشته استفاده میشود.
[Length(2, 30)]
public string Name { get; set; }
[Length(2, 255)]
public string Description { get; set; }
Name باید حداقل ۲ و حداکثر ۳۰ کاراکتر داشته باشد.Description باید حداقل ۲ و حداکثر ۲۵۵ کاراکتر داشته باشد.Range حالا قابلیت مشخص کردن مقادیر انحصاری را نیز دارد.[Range(1, 1000, MinimumIsExclusive = true, MaximumIsExclusive = false)]
public decimal Price { get; set; }
Price باید بزرگتر از ۱ (به دلیل MinimumIsExclusive = true) و کوچکتر یا مساوی ۱۰۰۰ (به دلیل MaximumIsExclusive = false) باشد.[AllowedValues("S", "M", "L", "XL", "XXL")]
public string Size { get; set; }S, M, L, XL, XXL برای Size قابل قبول هستند.[DeniedValues("Electronics", "Computers")]
public string Category { get; set; }Electronics و Computers برای Category ممنوع هستند.Base64 باشد استفاده میشود.[Base64String]
public string Image { get; set; }
Image حاوی یک رشته معتبر Base64 است.
🔶 امشب ساعت ۸:۳۰ تو این لایو یوتیوب قراره در مورد مفاهیم LLM و روشهای برنامهنویسی باهاشون در داتنت صحبت کنیم، و در نهایت هم نحوه ساختن و استفاده کردن از MCP ها رو بررسی کنیم.
#dotnet #csharp #openai #llm #azure #mcp
#cs_internship
https://www.youtube.com/live/c75VZWa_wbU
کانال تلگرام:
@SoftwarePhilosophy
____
مقدمهای بر کلاسها در سی شارپ
#csharp_for_beginners
در زبان برنامهنویسی C#، کلاسها (Classes) به عنوان یکی از اصلیترین ساختارهای برنامهنویسی شیءگرا عمل میکنند. کلاسها در C# قالبی برای ایجاد اشیاء (Objects) هستند و شامل دادهها (فیلدها و خصوصیات) و رفتارها (متدها) میشوند.
در این مقاله، مفهوم کلاس در C#، نحوه تعریف آن، انواع اعضای کلاس، اصول شیءگرایی مرتبط و مفاهیم پیشرفته بررسی خواهند شد.
۱. تعریف کلاس در C#
در C#، کلاس با استفاده از کلمه کلیدی class تعریف میشود. یک کلاس میتواند شامل متغیرها، خصوصیات، متدها و رویدادها باشد. در ادامه یک نمونه ساده از کلاس آورده شده است:
public class Car
{
public string Brand;
public string Model;
public int Year;
public void DisplayInfo()
{
Console.WriteLine($"Brand: {Brand}, Model: {Model}, Year: {Year}");
}
}
class Program
{
static void Main()
{
Car myCar = new Car();
myCar.Brand = "Toyota";
myCar.Model = "Corolla";
myCar.Year = 2022;
myCar.DisplayInfo();
}
}
public class Car
{
private string brand;
public string Brand
{
get { return brand; }
set { brand = value; }
}
}
استفاده از property باعث افزایش امنیت و کنترل بیشتر بر روی دادهها میشود.Читать полностью…
متدها (Methods)
متدها وظایف خاصی را در کلاس انجام میدهند. در مثالهای قبل، DisplayInfo() یک متد بود که اطلاعات را چاپ میکرد.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
متدها در سیشارپ
#csharp_for_beginners
متدها در زبان برنامهنویسی C# بلوکهایی از کد هستند که مجموعهای از دستورات را در بر میگیرند. اجرای این دستورات با فراخوانی متد و ارائه آرگومانهای مورد نیاز صورت میگیرد. در C#، هر دستور اجرایی در زمینه یک متد انجام میشود. به عنوان مثال، متد Main نقطه ورود هر برنامه C# است که توسط محیط اجرای مشترک زبان (CLR) هنگام شروع برنامه فراخوانی میشود.
امضای متدها
متدها در یک کلاس، ساختار یا اینترفیس با مشخص کردن سطح دسترسی (مانند public یا private)، اصلاحکنندههای اختیاری (مانند abstract یا sealed)، نوع بازگشتی، نام متد و هر پارامتر مورد نیاز تعریف میشوند. این اجزا با هم امضای متد را تشکیل میدهند. توجه داشته باشید که نوع بازگشتی بخشی از امضای متد برای اهداف سربارگذاری متد محسوب نمیشود، اما در تعیین سازگاری بین یک نماینده (delegate) و متدی که به
آن اشاره میکند، مهم است.
فراخوانی متدها
برای فراخوانی یک متد، پس از نام شیء، یک نقطه، نام متد و پرانتزها را اضافه میکنیم. آرگومانها در داخل پرانتزها قرار میگیرند و با کاما از هم جدا میشوند. به عنوان مثال، اگر کلاسی به نام Motorcycle با متدهایی مانند StartEngine، AddGas و Drive داشته باشیم، میتوانیم آنها را به صورت زیر فراخوانی کنیمTestMotorcycle moto = new TestMotorcycle();
moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);
double speed = moto.GetTopSpeed();
Console.WriteLine("My top speed is {0}", speed );
ساخت برنامههای Mixed Reality و 3D با Unity
ساختن برنامههایی که با دنیای واقعی مرتبط هستند یکی از قسمتهای هیجانانگیز برنامهنویسی است.
یکی از معروفترین ابزارها برای ساخت چین برنامههایی Unity هست.
کاربرد اصلی Unity ساخت بازی است. بازیهایی که هم در کامپیوتر، و هم در محیطهایی مثل VR/AR Headsets قابل اجرا هستند.
با اینکه کاربرد اصلی Unity ساخت بازی است، ولی از آن برای ساخت برنامههای Enterprise ی که نیاز به محیطهای 3D و Mixed Reality هم استفاده میشود. مثلا نمایش وضعیت دستگاههای یک کارخانه، یا وضعیت هواپیماها در یک فرودگاه.
این ویدئو، در مورد ساخت چین برنامههایی صحبت میکند و توضیح میدهد که چگونه میتوان با Unity برای این نوع مسائل برنامهبنویسی کرد.
آخرای این ویدئو کوه کلیمانجارو رو توی اتاق خونش رندر میکنه!
و بعدش نشون میده که چطور مغز انسان رو تو اتاق و جلوی چشمش لود میکنه و این نوع برنامهها چه کمکهای بزرگی به علم پزشکی میکنن.
🔗 ویدئو را میتوانید اینجا ببینید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
ساخت یک MCP Server ساده با سیشارپ
اگه برنامهنویس #داتنت هستین، تو این پست توضیح داده که چطور با #سیشارپ میتونین یه MCP Server بالا بیارین و توی Cursor تستش کنین.
اگر نمیدونین MCP چیه، یه چورایی همون معادل REST API دنیای وب، در هوش مصنوعیه. یعنی سیستمهای مختلف امکانات هوشمصنوعی خودشون رو از این طریق در اختیار بقیه سیستمهای هوشمصنوعی قرار میدن.
مفهوم MCP از اونجایی خیلی مهمه که میتونه همون نقشی که ظهور API ها در دنیای وب باعث گسترش یک عالمه اینتگریشن شد، همون نقش رو میتونن MCP ها هم بازی کنن و باعث رشد خیلی زیاد محصولات هوشمصنوعی باشیم.
تو این پست قدم به قدم اول یه پروژه داتنتی ساده درست کرده و بعد کدهای مربوط به MCP رو نوشته و در آخر هم نشون داده که چطور میتونین این MCP رو با Cursor تست کنین.
https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p
https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
آشنایی با Outbox Pattern و اهمیت آن در سیستمهای توزیعشده
آیا تاکنون در توسعهی یک سیستم توزیعشده با این دغدغه مواجه شدهاید که هنگام ثبت تغییرات در پایگاه داده و همزمان ارسال پیام (رویداد) به یک سرویس دیگر (مانند RabbitMQ یا Kafka)، ممکن است یکی از این مراحل با موفقیت انجام شود و دیگری با شکست روبهرو گردد؟ در چنین شرایطی، بخشی از دادهها بهروز میشود اما سرویسهای مصرفکننده از این تغییرات بیخبر میمانند و هماهنگی میان بخشهای مختلف سیستم از بین میرود.
مشکل اصلی کجاست؟
بهطور معمول، اگر در حین بهروزرسانی یک موجودیت در پایگاه داده بخواهیم یک رویداد نیز به سیستم دیگری ارسال کنیم و مراحل دیتابیس و ارسال پیام در یک تراکنش مجزا یا بهصورت ناهمزمان انجام شوند، احتمال از دست رفتن یا عدم ارسال پیام وجود دارد. این امر ممکن است به ناسازگاری در دادهها و عملکرد سرویسهای وابسته منجر شود.
راهحل چیست؟
در اینجاست که الگوی Outbox وارد عمل میشود. این الگو پیشبینی میکند که ابتدا همهی رویدادهایی که قرار است برای سیستمهای دیگر ارسال شوند در جدولی اختصاصی (Outbox Table) در همان پایگاه دادهی اصلی ذخیره شوند. این کار همزمان با تراکنش بهروزرسانی سایر دادهها صورت میگیرد، بهطوریکه اگر عملیات اصلی موفق باشد، اطلاعات رویداد نیز قطعاً ثبت میشود.
سپس چه میشود؟
یک فرایند مجزا (Outbox Process) بهطور مستمر این جدول را بررسی میکند و رویدادهای ثبتشده را به پیامرسان (Message Broker) ارسال میکند. در صورت موفقیت در ارسال، رکورد مربوطه از جدول Outbox حذف میشود و بدین ترتیب از ارسال مجدد ناخواسته جلوگیری میگردد. اگر هم پیامرسان در لحظه غیرفعال باشد یا خطایی رخ دهد، رکورد رویداد کماکان در پایگاه داده باقی میماند تا در تلاش بعدی مجدداً ارسال شود.
مزایای Outbox Pattern
۱. جلوگیری از ناسازگاری دادهها: با انجام ثبت رویداد و تغییرات داده در یک تراکنش واحد، احتمال بروز تناقض در دادهها کاهش مییابد.
۲. اطمینان از عدم از دست رفتن رویدادها: حتی اگر زیرساخت ارتباطی یا پیامرسان موقتاً از دسترس خارج شود، پیام در Outbox محفوظ میماند و پس از بازگشت سرویس، ارسال خواهد شد.
۳. مقیاسپذیری بالا: افزودن سرویسهای جدید یا گسترش زیرساخت پیامرسانی تحت تأثیر این الگو بهراحتی امکانپذیر است، چرا که شیوهی ثبت و ارسال رویدادها مشخص و یکپارچه است.
در واقع Outbox Pattern راهکاری قدرتمند و مطمئن برای ساخت سیستمهای توزیعشده و مبتنی بر رویداد است و کمک میکند دغدغهی شکست ارسال پیام و ناسازگاری دادهها برطرف شود.
🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#هوتن_همتی (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
___________
حلقهها در سیشارپ
#csharp_for_beginners
در برنامهنویسی، حلقهها ابزارهای قدرتمندی برای اجرای مجموعهای از دستورات بهصورت مکرر هستند. در زبان برنامهنویسی C#، انواع مختلفی از حلقه وجود دارد که به برنامهنویسان امکان میدهد تا وظایف تکراری را با کارایی بالا انجام دهند. در این مقاله، انواع مختلف حلقهها در C# را بررسی کرده و نحوه استفاده از آنها را توضیح خواهیم داد.
حلقه for
حلقه for معمولاً زمانی استفاده میشود که تعداد تکرارها مشخص باشد. این حلقه شامل سه بخش اصلی است:
۱. مقداردهی اولیه
۲. شرط ادامه حلقه
۳. افزایش یا کاهش مقدار متغیر کنترلی
مثال:
for (int i = 0; i < 5; i++)
{
; ("مقدار i: " + i)Console.WriteLine
}
int i = 0;
while (i < 5)
{
;("مقدار i: " + i)Console.WriteLine
i++;
}
int i = 0;
do
{
;("مقدار i: " + i)Console.WriteLine
i++;
} while (i < 5);
بررسی و تفاوت چند نوع عددی در سی شارپ: float , int , double , decimal
#csharp_for_beginners
وقتی شما برای زمان طولانی مدت با زبان برنامه نویسی C# کار میکنید متغییرها برای شما به چیزهای عادی و روزمره تبدیل میشوند اما حالا میخواهیم نگاهی دقیقتر به متغییرهای عددی مانند (decimal , double , float , int) داشته باشیم.
▫️چرا int پیش فرض است؟
این به این معنی است که اگر شما یک عدد صحیح را بدون مشخص کردن نوع آن بنویسید، c# به طور خودکار آن را به عنوان int در نظر میگیرد.
در سی شارپ، برای بهبود عملکرد، متغیر عدد به طور پیش فرض روی int قرار می گیرد. int به بهترین وجه با معماری ۳۲ بیتی دات نت هماهنگ است و عملیات سریعتر و کارآمدتر را تضمین می کند. این ممکن است با استاندارد شدن معماری 64 بیتی تغییر کند، اما در حال حاضر، اعداد صحیح ۳۲ بیتی کارآمدترین انتخاب هستند.
مانند مثال روبرو :
var number = 10
float floatValue = 1f / 3f;
double doubleValue = 1d / 3d;
decimal decimalValue = 1m / 3m;