Software Philosophy
3.48K subscribers
156 photos
41 videos
1.49K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
قابلیت‌های جدید 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 با پارامترهای Exclusive
ویژگی Range حالا قابلیت مشخص کردن مقادیر انحصاری را نیز دارد.

[Range(1, 1000, MinimumIsExclusive = true, MaximumIsExclusive = false)]
public decimal Price { get; set; }

در این مثال:
- مقدار Price باید بزرگتر از ۱ (به دلیل MinimumIsExclusive = true) و کوچکتر یا مساوی ۱۰۰۰ (به دلیل MaximumIsExclusive = false) باشد.

---

۳. ویژگی AllowedValues
این Annotation مقادیر مجاز برای یک خصوصیت را مشخص می‌کند.

[AllowedValues("S", "M", "L", "XL", "XXL")]
public string Size { get; set; }

در اینجا، تنها مقادیر S, M, L, XL, XXL برای Size قابل قبول هستند.

---

۴. ویژگی DeniedValues
برای مشخص کردن مقادیری که غیرمجاز هستند استفاده می‌شود.

[DeniedValues("Electronics", "Computers")]
public string Category { get; set; }

در این مثال، مقادیر Electronics و Computers برای Category ممنوع هستند.

---

۵. ویژگی Base64String
برای معتبرسازی اینکه مقدار یک رشته به صورت Base64 باشد استفاده می‌شود.

[Base64String]
public string Image { get; set; }

این اطمینان را ایجاد می‌کند که Image حاوی یک رشته معتبر Base64 است.

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

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

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

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

__________
1👍203🔥2
آشنایی با آرایه‌ها در زبان سی‌شارپ

#csharp_for_beginners

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

تعریف آرایه
آرایه در سی‌شارپ شیئی است که شامل عناصر متعددی از یک نوع مشخص می‌باشد. هنگام تعریف آرایه، باید نوع داده‌ای عناصر و تعداد آن‌ها را مشخص کنیم. به‌عنوان مثال:

csharpCopyEditint[] numbers = new int[5];



در این مثال، یک آرایه از اعداد صحیح تعریف شده که می‌تواند پنج مقدار را در خود جای دهد. اندیس‌گذاری آرایه‌ها در سی‌شارپ از صفر شروع می‌شود؛ یعنی اولین عنصر در اندیس ۰ قرار دارد.

مقداردهی اولیه به آرایه
می‌توان هنگام تعریف آرایه، مقداردهی اولیه نیز انجام داد:

csharpCopyEditstring[] names = { "Ali", "Sara", "Reza" };

در این حالت، نیازی به تعیین اندازه آرایه نیست، زیرا بر اساس تعداد مقادیر داده‌شده مشخص می‌شود.


انواع آرایه‌ها در سی‌شارپ
زبان سی‌شارپ از چند نوع آرایه پشتیبانی می‌کند:

۱. آرایه‌های یک‌بعدی
رایج‌ترین نوع آرایه است که فقط یک بُعد دارد:

csharpCopyEditdouble[] prices = new double[10];



۲. آرایه‌های چندبعدی
این نوع آرایه‌ها مانند ماتریس‌ها می‌توانند بیش از یک بُعد داشته باشند:

csharpCopyEditint[,] matrix = new int[3, 4]; // یک ماتریس ۳ در ۴


۳. آرایه‌های دندانه‌دار (Jagged Arrays)
آرایه‌هایی از آرایه‌ها هستند؛ یعنی هر عنصر خود می‌تواند یک آرایه مجزا باشد، حتی با طول متفاوت:

csharpCopyEditint[][] jaggedArray = new int[2][];
jaggedArray[0] = new int[3];
jaggedArray[1] = new int[5];


دسترسی به عناصر آرایه
برای دسترسی یا تغییر مقدار یک عنصر از آرایه، از اندیس آن استفاده می‌کنیم:

csharpCopyEditnumbers[0] = 10;
Console.WriteLine(numbers[0]);




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

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

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

______
👍141
ابزار string visualizer در ویژوال استودیو

یکی از دم دست‌ترین امکانات #visualstudio ابزار string visualizer است. به محض اینکه موس روی متغیری قرار بگیره، این ابزار مقدار string اون متغییر رو نشون می‌ده.

خب تا اینجا که چیزی نیست!

ابزار string visualizer یه امکان مفید و بسیار کاربردی داره که شاید تا به حال خیلی بهش دقت نکرده باشید. شما می‌تونید نوع string visualizer خودتون رو از قسمت string manipulation انتخاب کنید. مثلا اگه مقدارش یه JWT بود، می‌تونید مقدار Decode شده JWT رو مشاهده کنید.

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

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

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

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

______
👍9🔥2
نوع داده‌ی 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 تنها می‌تواند دو مقدار زیر را داشته باشد:
• true (صحیح)
• false (نادرست)

تلاش برای مقداردهی دیگر به یک متغیر bool باعث خطای کامپایلر خواهد شد.

کاربردهای رایج bool
نوع bool به طور گسترده‌ای در عبارات شرطی مانند if، حلقه‌های while و do-while، و همچنین در اپراتورهای منطقی به کار می‌رود:

bool isLoggedIn = true;

if (isLoggedIn)
{
Console.WriteLine("Welcome back!");
}
else
{
Console.WriteLine("Please log in.");
}


در این مثال، برنامه براساس مقدار متغیر isLoggedIn تصمیم می‌گیرد که چه پیامی نمایش داده شود.

عملیات منطقی روی bool
بر روی متغیرهای bool می‌توانید عملیات منطقی انجام دهید، مثل:
• && (AND منطقی)
• || (OR منطقی)
• ! (NOT منطقی)

bool hasUsername = true;
bool hasPassword = false;

if (hasUsername && hasPassword)
{
Console.WriteLine("Login successful.");
}
else
{
Console.WriteLine("Missing username or password.");
}



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

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

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

______
👍131🥰1
چرا می‌گن «C# is Java done right»؟

هر دو زبان جاوا و سی‌شارپ زبان‌های خیلی قدرتمندی هستن و در پروژه‌های بزرگی استفاده می‌شن.
از طرفی باید قبول کرد که از لحاظ syntax، زبان سی‌شارپ پیشرفته‌تر و خوش‌دست‌تر است.
این ویدئو ویژگی‌های مهمی که در سی‌شارپ بهتر پیاده‌سازی شدن و باعث می‌شه زبان مدرن‌تری حساب بشه رو توضیح می‌ده.
از معروف‌ترین تفاوت‌ها، پیاده‌سازی ناقص Generic ها در جاوا و پیاده‌سازی خوبش در سی‌شارپ است.
ویژگی Property و Async/Await هم یکی از ویژگی‌های خیلی مهمه که مدت‌هاست در سی‌شارپ وجود داره.
همینطور LINQ ویژگی خیلی جذابیه که پیاده‌سازی مشابهش تو جاوا هم خیلی دیرتر اضافه شد، و هم اینکه به خوش‌دستی پیاده‌سازی سی‌شارپ نیست.

🔗 تو این ویدئوی کوتاه این تفاوت‌ها رو خیلی واضح‌تر و لذت‌بخش‌تر توضیح داده.

نظر شما در مورد این دو تا زبان چیه؟

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

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

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

______
3👍18🔥106
بررسی کامل انواع عددی صحیح (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 بیت (وابسته به معماری)


ویژگی‌های عمومی انواع عددی صحیح
تمامی انواع بالا ویژگی‌های مشترک زیر را دارند:
نوع مقدار (Value Type): برخلاف کلاس‌ها، این نوع‌ها مستقیماً مقدار را نگه‌داری می‌کنند، نه اشاره به آن.
مقدار پیش‌فرض: برای همه این نوع‌ها مقدار پیش‌فرض برابر صفر (0) است.
ثابت‌های MinValue و MaxValue: هر نوع دارای دو ثابت برای نمایش کمترین و بیشترین مقدار قابل نگهداری است.
پشتیبانی از عملیات ریاضی: از جمله +, -, *, /, %، عملیات بیتی مانند &, |, ^, ~، عملیات مقایسه‌ای مثل <, >, ==, !=، و عملیات شیفت <<, >>.

انواع nint و nuint
این دو نوع در نسخه‌های جدید سی شارپ معرفی شده‌اند و برای سناریوهایی مناسب‌اند که اندازه نوع باید متناسب با معماری سیستم (32 یا 64 بیت) باشد، مانند کار با اشاره‌گرها یا توابع سطح پایین سیستم عامل. این نوع‌ها به‌ترتیب معادل با IntPtr و UIntPtr در .NET هستند.

استفاده از لیترال‌های عددی
در سی شارپ می‌توان از لیترال‌ها برای مقداردهی مستقیم استفاده کرد. به‌عنوان مثال:int a = 100;
uint b = 100u;
long c = 100L;
ulong d = 100UL;


تبدیل نوع (Type Conversion)
هنگام تبدیل میان انواع عددی صحیح، باید به موارد زیر توجه کرد:
تبدیل ضمنی (Implicit): زمانی که داده از نوع کوچکتر به نوع بزرگ‌تر تبدیل می‌شود (مثلاً int به long)، بدون نیاز به دستور خاص.
تبدیل صریح (Explicit): در حالت معکوس (مثلاً long به int)، به تبدیل صریح یا cast نیاز است و ممکن است دقت از بین برود.
int x = 123;
long y = x; // تبدیل ضمنی

long a = 1000L;
int b = (int)a; // تبدیل صریح



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

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

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

______
👍71
آشنایی با کلاس‌ها در زبان برنامه‌نویسی سی شارپ

#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...");
}
}


ایجاد نمونه (Instance)
برای استفاده از یک کلاس، باید از آن نمونه‌سازی کنیم. این نمونه یک شیء واقعی از کلاس است که می‌توان از آن در برنامه استفاده کرد:

Car myCar = new Car();
myCar.Color = "Red";
myCar.Drive();


سازنده‌ها (Constructors)

سازنده‌ها متدی خاص در کلاس هستند که هنگام ایجاد یک شیء جدید فراخوانی می‌شوند. آن‌ها معمولاً برای مقداردهی اولیه به ویژگی‌های شیء استفاده می‌شوند:

public class Car
{
public string Color;

// سازنده
public Car(string color)
{
Color = color;
}
}


و استفاده از آن:

Car myCar = new Car("Blue");


دسترسی و سطح دسترسی

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

وراثت (Inheritance)
یکی از ویژگی‌های قدرتمند کلاس‌ها، وراثت است. یک کلاس می‌تواند از کلاس دیگری ارث‌بری کند و ویژگی‌ها و رفتارهای آن را به ارث ببرد

public class Vehicle
{
public void Start() => Console.WriteLine("Starting...");
}

public class Car : Vehicle
{
public void Drive() => Console.WriteLine("Driving...");
}



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

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

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

______
👍93🔥2
کار با داده‌های 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"
}


مثال ۲: ترکیب با GROUP BY برای داده‌های تجمیعی
فرض کنید جدولی به اسم 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}}
]


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

🔗لینک اول

🔗لینک دوم

🔗لینک سوم

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

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

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

_______
👍12👏42
Forwarded from فلسفه دیزاین
طراحی، توسعه و انتشار یک وب‌اپ با استفاده از هوش مصنوعی

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

اولین مرحله، ایجاد یک ایده و طراحی رابط کاربری با استفاده از ابزارهای هوش مصنوعی مانند Figma و Uizard است. این ابزارها می‌توانند از طریق توصیف متنی یا تصاویر ورودی، طرح‌های اولیه را ایجاد کنند و به کاربران کمک کنند تا بدون نیاز به مهارت طراحی پیچیده، یک رابط کاربری مناسب بسازند. برخی از این ابزارها همچنین امکان پیشنهاد تغییرات و بهینه‌سازی طراحی را بر اساس بهترین شیوه‌های UX ارائه می‌دهند.

پس از طراحی، مرحله‌ی توسعه آغاز می‌شود که در آن هوش مصنوعی می‌تواند کدهای موردنیاز را تولید کند. ابزارهایی مانند ChatGPT (با قابلیت کدنویسی)، GitHub Copilot و Replit به کاربران امکان می‌دهند تا کدهای HTML، CSS، و JavaScript را تنها از طریق دستورات متنی ایجاد کنند. این فرایند باعث کاهش نیاز به دانش عمیق کدنویسی شده و توسعه‌ی وب‌اپلیکیشن‌ها را برای افراد بیشتری قابل‌دسترس می‌کند.

پس از تولید کد، گام بعدی تست و بهینه‌سازی اپلیکیشن است. ابزارهای تست خودکار مبتنی بر هوش مصنوعی مانند Testim و Applitools می‌توانند به سرعت باگ‌ها و مشکلات احتمالی را شناسایی کنند. این ابزارها، با استفاده از یادگیری ماشینی، می‌توانند پیشنهاداتی برای بهبود عملکرد، امنیت و سازگاری وب‌اپ ارائه دهند. این مرحله از اهمیت ویژه‌ای برخوردار است، زیرا کیفیت محصول نهایی را تضمین می‌کند.

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

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

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

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

(مدت زمان مطالعه: ۴ دقیقه)

گردآورنده: فاطمه حیدری

#طراحی_محصول
#AI

@Dexign فلسفه دیزاین

______
👍62
آموزش گام‌به‌گام دیباگ برنامه‌های 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

______
👍51
معرفی کلاس <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<T لیسی دینامیک است که به صورت خودکار اندازه‌اش را بر اساس داده‌های ورودی تغییر می‌دهد و برخلاف آرایه‌ها، نیازی به تعیین اندازه‌ی اولیه آن نیست.

ویژگی‌های اصلی
•عمومی بودن نوع داده: می‌توان لیستی از هر نوع داده‌ای ایجاد کرد (مثل <List<int یا <List<string ).
پشتیبانی از عملیات متنوع: افزودن، حذف، جست‌وجو، مرتب‌سازی و … به‌سادگی قابل انجام هستند.
اندازه‌ی متغیر: نیازی به تعیین اندازه در زمان تعریف نیست.
دسترسی سریع با ایندکس: مانند آرایه‌ها می‌توان به اعضای لیست با استفاده از اندیس دسترسی داشت.

نمونه کد ساده
List<string> names = new List<string>();
names.Add("Ali");
names.Add("Sara");
names.Add("Reza");

foreach (string name in names)
{
Console.WriteLine(name);
}


سازنده‌ها (Constructors)
کلاس List<T> دارای چند سازنده برای ایجاد لیست است:
• List<T>()
ایجاد یک لیست خالی.
• List<T>(IEnumerable<T>)
ایجاد لیست با استفاده از مجموعه‌ای دیگر.
• List<T>(int capacity)
تعریف ظرفیت اولیه لیست
—————————————————————

متدهای مهم کلاس List<T>
۱. Add
اضافه کردن یک عنصر به انتهای لیست.

۲. AddRange
اضافه کردن مجموعه‌ای از عناصر به لیست.

۳. Remove
حذف اولین عنصر مشخص‌شده از لیست.

۴. RemoveAt
حذف عنصری که در یک ایندکس خاص قرار دارد.

۵. Clear
پاک کردن تمام عناصر لیست و خالی کردن آن.

۶. Contains
بررسی وجود یک عنصر در لیست.

۷. IndexOf
یافتن ایندکس اولین وقوع یک عنصر مشخص.

۸. Sort
مرتب‌سازی عناصر لیست به ترتیب صعودی یا با مقایسه‌گر سفارشی.

۹. Reverse
معکوس کردن ترتیب عناصر لیست.

۱۰. ToArray
تبدیل لیست به آرایه.

۱۱. Count
گرفتن تعداد عناصر موجود در لیست (ویژگی - property).

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

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

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

______
👍65🔥3
پشته (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);


۲. Pop()

حذف و بازگرداندن عنصر بالای پشته:

object top = stack.Pop(); // آخرین مقدار افزوده‌شده را برمی‌گرداند


۳. Peek()

فقط مشاهدهٔ عنصر بالای پشته بدون حذف آن:

object top = stack.Peek();


۴. Count

تعداد عناصر موجود در پشته:

int count = stack.Count;


۵. Clear()

پاک‌سازی کامل پشته:

stack.Clear();


۶. Contains(object obj)

بررسی وجود یک عنصر خاص:

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



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

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

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

______
👍96👏2
Forwarded from TondTech (مسعود بیگی)
دوستان خوب و عزیزم سلام، من و تیم خوبم در #رسمیو، مدتی رو سرمون خلوت خواهد بود و دوست داریم به شکل مشاوره یا همکاری در انجام پروژه های شما (به صورت صفر تا صد یا مشارکت در پیاده سازی بخشی از سرویس هاتون) همراه باشیم .

ما توی تیممون به جز توسعه دهندگان .net و React ، پروداکت منیجر و دیزاینر هم داریم اگر لازم داشته باشید برای این پروژه ها.

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


بعد از پایان پروژه هم، پروژه رو به تیم تون تحویل میدیم و اگر نیاز به آموزشی باشه، در حد توان راهنمایی و آموزش نیروهاتون رو هم بر عهده خواهیم گرفت.

خیلی به من لطف خواهید کرد اگر این پست را در همه ی گروه های فنی و بیزنسی تان منتشر کنید.
متاسفانه فعلا فقط از طریق اکانت تلگرام @StartupNerd وشماره 09308282925 در خدمت شما و پاسخگو خواهم بود.

🫂 مجددا از شما خواهش میکنم این پست رو (در همه ی گروه های خودتون که فکر میکنید ممکنه کسی به توانایی ما نیاز داشته باشه) بازنشر کنید
11👍5🔥1
صف (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

______
👍96
آشنایی با Namespace

#csharp_for_beginners

۱. مفهوم Namespace

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

سازمان‌دهی داخلی: تقسیم کلاس‌ها، ساختارها، رابط‌ها و… در پروژه، به گونه‌ای که ساختار واضح‌تری داشته باشند.
نمایش بیرونی: وقتی که برنامه یا کتابخانه‌ای قرار است در جایی دیگر استفاده شود، نام اعضا (types) مشخص و قابل تفکیک هستند.

۲. نحوه تعریف Namespace
با کلیدواژه namespace و سپس یک شناسه (یا مجموعه‌ای از شناسه‌ها با نقطه)
namespace MyApp.Services
{
class MyService { }
}


یا روش جدید File‑scoped از C#10
csharp

namespace MyApp.Services;

class MyService { }


۳. قوانین نام‌گذاری (Naming Guidelines)
توصیه می‌شود نام‌ها شامل <شرکت>.<محصول یا تکنولوژی>[.<ویژگی>] باشند.

از PascalCase استفاده شود و از تغییر نام‌های عمومی یا تک‌کلمه مانند Log, Message خودداری شود تا از تداخل جلوگیری شود.

۴. نکات فنی و ساختاری
فضای جهانی (global namespace) همیشه حضور دارد و انواع بدون namespace در آن تعریف می‌شوند.

توصیه می‌شود برای سازمان‌دهی فایل‌ها، هر پوشه متناظر با یک namespace باشد. استفاده از پایه فایل‌ها یک نوع استاندارد مدرن است.

۵. تو در تویی Namespace (Open Namespace )
می‌توان namespace را داخل یک namespace دیگر تعریف کرد یا در فایل‌های متعدد با یک نام مشترک تعریف‌هایی مجزا داشت و همه به هم ملحق می‌شوند.

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

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

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

______
4👍3🔥1
تبدیل نوع (Casting & Type Conversions) در سی‌شارپ

#csharp_for_beginners

در زبان برنامه‌نویسی سی‌شارپ، متغیرها انواع (Types) مختلفی دارند؛ مانند int، double، string و غیره. گاهی اوقات نیاز داریم مقدار یک نوع را به نوعی دیگر تبدیل کنیم. این فرآیند تبدیل نوع (Type Conversion) یا Casting نامیده می‌شود. سی‌شارپ دو نوع اصلی تبدیل دارد:

Implicit Conversion
Explicit Conversion / Casting

تبدیل ضمنی (Implicit Conversion)
در این نوع تبدیل، کامپایلر خودش به‌طور خودکار نوع را تبدیل می‌کند، چون خطر از دست رفتن داده وجود ندارد. مثلاً وقتی مقدار int را به long تبدیل می‌کنیم:

int myInt = 100;
long myLong = myInt; // تبدیل ضمنی



تبدیل صریح (Explicit Conversion / Casting)
زمانی که احتمال از بین رفتن اطلاعات وجود دارد یا کامپایلر نمی‌تواند به‌طور خودکار نوع را تبدیل کند، باید از cast صریح استفاده کنیم:

double myDouble = 123.45;
int myInt = (int)myDouble; // تبدیل صریح



استفاده از توابع Convert
سی‌شارپ کلاس System.Convert را برای تبدیل بین انواع مختلف فراهم کرده است:

string myString = "123";
int myInt = Convert.ToInt32(myString); // تبدیل رشته به عدد صحیح



استفاده از Parse و TryParse
برای تبدیل رشته به عدد (یا انواع مشابه)، می‌توان از متد Parse یا TryParse استفاده کرد:

string myString = "456";
int myInt = int.Parse(myString); // اگر رشته ناصحیح باشد، استثناء رخ می‌دهد

bool success = int.TryParse(myString, out int result);
// اگر موفق باشد، result مقدار عددی می‌گیرد، در غیر این صورت صفر می‌شود


تبدیل نوع‌های مرجع (Reference Types)
در حالت‌های پیشرفته‌تر، تبدیل نوع بین کلاس‌ها (مثلاً از یک کلاس فرزند به کلاس والد یا برعکس) هم امکان‌پذیر است:

object obj = "Hello";
string str = (string)obj; // تبدیل صریح با cast

// استفاده از 'as'
string str2 = obj as string; // اگر نشود، مقدار null برمی‌گرداند



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

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

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

______
👍87
جایگزین‌هایی برای کتابخانه‌های محبوب AutoMapper و MediatR

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

❗️این یعنی ممکن است در آینده برای استفاده از نسخه‌های جدید یا پشتیبانی، نیاز به پرداخت هزینه باشد.

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

البته خیلی هم بد نشد! Automapper داشت از Reflection استفاده می‌کرد در حالی که جایگزین‌هایی ساخته شده‌اند که زمان کامپایل Mapping را انجام می‌دهند و حداقل ۴ برابر سرعت بهتر و همچنین استفاده منابع کمتری نیاز دارند.

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

این دو گزینه Mapperly و Mapster هستند.

بین اینها هم از لحاظ آپدیت بودن سورس کد گیت هاب، راحتی بهتر برای دیباگ و رفع خطای بهتر و ... هم از Mapperly استفاده می‌کنم.

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

در مورد MediatR چه پیشنهادی دارید و به چه نتیجه‌ای رسیدید؟ لطفا تجربه خود را با ما به اشتراک بگذارید ...

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

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

______
115👍7🔥3👏1
متغیرهای محلی با نوع ضمنی (var) در سی‌شارپ

#csharp_for_beginners

در سی‌شارپ، زمانی که متغیری را با استفاده از کلیدواژه var تعریف می‌کنید، نیازی به مشخص کردن نوع آن ندارید؛ زیرا کامپایلر نوع مناسب را از بند عبارت سمت راست تشخیص می‌دهد.
نوع ممکن است جزئی از انواع داخلی مثل int یا string باشد، یا حتی انواع ناشناس (anonymous types) یا انواع تعریف‌شده توسط کاربر یا کتابخانه‌های دات‌نت.

نمونه‌های کاربردی

مثال‌هایی از تعریف متغیرهای ضمنی با var:

var i = 5;                     // نوع int
var s = "Hello"; // نوع string
var a = new[] { 0, 1, 2 }; // نوع int[]
var expr = from c in customers where c.City == "London" select c; // IEnumerable<Customer> یا IQueryable<Customer>
var anon = new { Name = "Terry", Age = 34 }; // نوع ناشناس
var list = new List<int>(); // List<int>


محدودیت‌ها و قوانین استفاده

-ابتدا باید مقداردهی شود: var فقط در صورتی کاربرد دارد که متغیر در همان خط تعریف، مقداردهی شده باشد. تعریف بدون مقدار (var x;) یا مقداردهی به null، باعث خطا می‌شود.
-قابل استفاده فقط در سطح محلی: نمی‌توان از var برای تعریف فیلدهای سطح کلاس، پارامترهای متد یا نوع بازگشتی متد استفاده کرد.
تعریف همزمان چند متغیر با var امکان‌پذیر نیست، نظیر: var a = 1, b = 2; باعث خطا می‌شود.
-نوع متغیر در طول زمان تغییر نمی‌کند: نوعی که کامپایلر تشخیص می‌دهد ثابت است.

کاربرد در LINQ و انواع ناشناس

در بسیاری از موارد استفاده از var اختیاری است؛ اما زمانی که نوع ناشناس به‌کار رفته، استفاده از var الزامی است، زیرا نوع ناشناس نام مشخصی ندارد:

var studentQuery = from student in students
where student.FirstName[0] == firstLetter
select new { student.FirstName, student.LastName };

foreach (var anonType in studentQuery)
{
Console.WriteLine($"First = {anonType.FirstName}, Last = {anonType.LastName}");
}


بدون var، امکان دسترسی به خواص این نوع‌ها وجود ندارد.

چه زمانی بهتر است یا بهتر نیست از var استفاده شود؟

استفاده از var خوانایی کد را بیشتر می‌کند، به‌ویژه در مواردی که نوع پیچیده‌ای پشت مقدار است (مثلاً Dictionary<string, List<int>>).
در اسناد رسمی مایکروسافت توصیه می‌شود از var فقط زمانی استفاده کنید که نوع از مقدار سمت راست به‌وضوح مشخص باشد. یعنی اگر از خواننده انتظار دارید نوع را تشخیص دهد، فقط در آن صورت از var استفاده کنید.
یکی از ابزارهای IDE (مثل Visual Studio) امکان تبدیل var به نوع صریح (explicit type) را برای خوانایی بیشتر فراهم کرده است؛ البته در شرایطی که مقدار در همان خط تعریف نشده یا نوع ناشناس نیست.

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

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

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

______
👍72🔥2
تجربه معماری شش ضلعی در نتفلیکس

وقتی تیم Studio Workflows در نتفلیکس تصمیم گرفت اپلیکیشن جدیدی برای مدیریت تولید محتوا بسازد، با چالشی بزرگ روبه‌رو شد: داده‌هایی که نیاز داشتند، در سیستم‌های مختلف پخش شده بود — از gRPC گرفته تا GraphQL و JSON API.

آن‌ها می‌دانستند که این منابع داده قرار است در آینده تغییر کنند، ولی نمی‌خواستند منطق برنامه‌‌هایشان هر بار به هم بریزد. برای همین تصمیم گرفتند از معماری شش‌ضلعی (Hexagonal Architecture) استفاده کنند.

نتیجه؟ وقتی مجبور شدند منبع داده را از JSON API به GraphQL تغییر دهند، بدون آنکه منطق اصلی برنامه دست بخورد!

این معماری کمک کرد تا:

- منطق کسب‌وکار را از منابع داده جدا کنند.

- تست‌نویسی راحت‌تر و سریع‌تری داشته باشند.

- برای تغییرات آینده آماده باشند.

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

🔗 تجربه‌ی نتفلیکس با معماری شش‌ضلعی یا Hexagonal Architecture

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

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

______
1👍84🔥2
مدیریت بهتر سرویس های self-hosted

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

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

ابزارهای متنوعی برای مدیریت این موضوع وجود دارد مثل Heroku، Vercel یا Netlify که محدودیت‌های زیادی دارند.

- ابزاری اوپن سورس و رایگان وجود دارد به نام Coolify

ابزاری اوپن‌سورس و سلف‌هاستد (self-hosted) که به شما اجازه می‌دهد خیلی راحت پروژه‌های خود را روی سرور خود دیپلوی و مدیریت کنید.
بدون نیاز به کلی کانفیگ عجیب غریب، می‌توانید با چند کلیک ساده سرویس‌هایی مثل دیتابیس، اپلیکیشن‌های داکری، یا حتی پروژه‌های Next.js و Laravel و Asp.net و ... را ران کنید.

🔗 آدرس گیت‌هاب.

📖 مستندات کامل.

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

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

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

______
112🔥4👍1