در این پست یک برنامه بسیار ساده را ارائه می دهم که در آن با تغییر اندازه فرم ، یک برچسب با نوشتن ابعاد داخلی فرم همواره در وسط فرم قرار می گیرد . این کار نسبتا خیلی ساده است اما من از نوشتن این کد کوچک و ساده منظور خاصی را دنبال می کنم و آن هم این است که آنچه در برنامه نویسی از خود کدنویسی مهمتراست رعایت اصول برنامه نویسی می باشد که با رعایت آن نکات برنامه شما براحتی قابل توسعه خواهد بود یعنی تمام آنچه که شما در کدهای زیر می بینید را می شود در چند خط نیز نوشت اما اگر شما اصول برنامه نویسی را رعایت نکنید هنگامی که می خواهید برنامه خود را توسعه دهید و یا برای موارد مشابه استفاده کنید با مشکلات و چالش های بزرگی مواجه می شوید پس بهتر است از ابتدای کار بجای اینکه کد هدف را یاد بگیرید اصول استفاده صحیح از کدها را یاد گرفته و از آن مهمتر اینکه به رعایت این اصول عادت کنید در غیر این صورت شما از یک برنامه نویس که می تواند برنامه های چند خطی بنویسد پا فراتر نمی گذارید . حالا متن کد زیر را بدقت بررسی کنید.
using System;
using System.Drawing;
using System.Windows.Forms;
namespace DynamicLabelPositioner
{
public partial class Form1 : Form
{
private Label sizeInfoLabel;
public Form1()
{
InitializeComponent();
InitializeControls();
}
private void InitializeControls()
{
sizeInfoLabel = lbl; // فرض میکنیم lbl در طراحی فرم تعریف شده است
UpdateLabelText();
CenterControl(sizeInfoLabel);
}
private void Form1_SizeChanged(object sender, EventArgs e)
{
UpdateLabelText();
CenterControl(sizeInfoLabel);
}
/// بهروزرسانی متن برچسب با اطلاعات اندازه فرم
private void UpdateLabelText()
{
if (ClientSize.Width >= 0 && ClientSize.Height >= 0)
{
sizeInfoLabel.Text = $"Width: {ClientSize.Width} Height: {ClientSize.Height}";
}
else
{
sizeInfoLabel.Text = "Invalid size detected";
}
}
/// مرکزی کردن یک کنترل در فرم
private void CenterControl(Control control)
{
if (control == null) return;
int x = (ClientSize.Width - control.Width) / 2;
int y = (ClientSize.Height - control.Height) / 2;
/// اطمینان از مختصات مثبت
control.Location = new Point(Math.Max(0, x), Math.Max(0, y));
}
}
در برنامه نویسی شی گرا موارد و اصولی وجود دارد که باید رعایت شوند . من این اصول را در 16 مورد جمع آوری کرده ام که در ذیل با یک جمله کوتاه آنها را توضیح می دهم.
1 – Don't Repeat Yourself یعنی خودت را تکرار نکن : از نوشتن کد تکراری پرهیز کن
2 – Keep It Simple, Stupid یعنی ساده نگهش دار احمق : بدون فدا کردن کارایی و دقت کد آن را تا حد امکان ساده نگه دارید.
3 - You Aren’t Gonna Need It یعنی بهش نیاز نداری : فقط چیزی رو پیادهسازی کن که الان لازم داری .
4 - Testability یعنی قابلیت تستپذیری : کد طوری طراحی بشه که به راحتی بتونید براش تست بنویسید و رفتارش رو بررسی کنید .
5 - Resource Management یعنی مدیریت بهینه منابع سیستم (مثل حافظه، فایلها یا اتصالات) در برنامهنویسی، طوری که تخصیص و آزادسازی اونها به موقع و بدون نشتی (leak) انجام بشه، مثلاً با استفاده از using در سیشارپ برای بستن خودکار اتصالات.
6 - Portability یعنی قابلیت انتقالپذیری : کد شما باید بتونه روی سیستمها، پلتفرمها یا محیطهای مختلف (مثل ویندوز، لینوکس) بدون تغییر یا با کمترین تغییر اجرا بشه.
7 - Coding Standards یا استانداردهای کدنویسی به مجموعهای از قوانین و راهنماییها گفته میشه که برنامهنویسان برای نوشتن کد تمیز، خوانا و یکنواخت ازش پیروی میکنن تا همکاری تیمی، نگهداری و فهم کد آسونتر بشه.
8 - Security یعنی امنیت در برنامهنویسی، که به حفاظت از نرمافزار و دادهها در برابر دسترسی غیرمجاز، حملات یا سوءاستفاده اشاره داره، مثلاً با رمزنگاری یا اعتبارسنجی ورودیها.
9 - Performance Optimization یعنی بهینهسازی عملکرد، که به بهبود سرعت و کارایی برنامه با کاهش مصرف منابع (مثل CPU یا حافظه) از طریق تکنیکهایی مثل الگوریتم بهتر یا کش کردن اشاره داره.
10 - Internationalization (i18n) یعنی بینالمللیسازی، که به طراحی نرمافزار به شکلی اشاره داره که بتونه به راحتی با زبانها، فرهنگها و مناطق مختلف (مثل پشتیبانی از چند زبان یا فرمت تاریخ) سازگار بشه.
11 - Maintainability & Readability یعنی قابلیت نگهداری و خوانایی، که به نوشتن کدی اشاره داره که ساده، قابل فهم و منظم باشه تا توسعهدهندهها بتونن به راحتی اون رو درک کنن و تغییرش بدن.
12 - Single Responsibility Principle (SRP) یعنی اصل مسئولیت واحد، که میگه هر کلاس یا ماژول باید فقط یک وظیفه یا مسئولیت داشته باشه تا تغییرات سادهتر و کد منظمتر بشه.
13 - Open/Closed Principle (OCP) یعنی اصل باز/بسته، که میگه کلاسها باید برای گسترش (اضافه کردن قابلیت جدید) باز باشن، اما برای تغییر (ویرایش کد موجود) بسته باشن.
14 - Liskov Substitution Principle (LSP) یعنی اصل جانشینی لیسکوف، که میگه اشیاء از کلاسهای فرزند باید بتونن جای کلاس والد رو بگیرن بدون اینکه رفتار برنامه خراب بشه.
15 - Interface Segregation Principle (ISP) یعنی اصل تفکیک رابط، که میگه کلاسها نباید مجبور بشن رابطهایی رو پیادهسازی کنن که استفاده نمیکنن، و رابطها باید کوچک و خاص باشن.
16 - Dependency Inversion Principle (DIP) یعنی اصل وارونگی وابستگی، که میگه ماژولهای سطح بالا و پایین باید به abstraction (مثل رابطها) وابسته باشن، نه به پیادهسازیهای خاص.
مفهوم overloading به زبان ساده در برنامه نویسی :
گاهی اوقات ممکن است شما بخواهید متدی با یک نام منحصر به فرد داشته باشد که با آن ، بر روی دو نوع داده یک عملیات مشابه انجام دهید (مثلا عملیات جمع) . همانطور که می دانید به دلیل متفاوت بودن نوع داده ها اینکار ممکن نیست . و بطور معمول ما سراغ دو متد با نام های متفاوت می رویم . شبیه آنچه در پایین می بینید .
static int PlusMethodInt(int x, int y)
{
return x + y;
}
static double PlusMethodDouble(double x, double y)
{
return x + y;
}
همانطور که می بینید ما از دو متد با نام های متفاوت استفاده می کنیم که اندکی ناخوشآیند است .ولی می توان کاری کرد که به هدفمان یک قدم نزدیکتر شویم و آن استفاده از overloading است overloading به این صورت است که شما در واقع دو متد را با یک نام تعریف می کنید ولی تفاوت این دو متد در نوع پارامترها و آرگومان های آنهاست. شبیه آنچه در پایین می بینید
static int PlusMethod(int x, int y)
{
return x + y;
}
static double PlusMethod(double x, double y)
{
return x + y;
}
با این کار در واقع ما با استفاده از یک نام مشترک اعدادی از نوع (int) را با همدیگر ، و همچنین اعدادی از نوع (double) را نیز با همدیگر جمع می کنیم و نیازی به استفاده از دو اسم متفاوت نداریم.
یک برنامه حاوی قسمت های زیر است .
1 . معرفی فضای نام . ( Namespace declaration )
2 . کلاس . ( class )
3 . متدها . ( methods )
4 . ویژگیها ( attributes )
5 . متد اصلی . ( Main method )
6 . عبارات و اصطلاحات . ( Statements and Expressions )
7 . توضیحات . ( Comments )
-------------------------------
یک نمونه برنامه که فقط عبارت ( Hello World ) را نمایش می دهد . ( این برنامه از نوع کنسول می باشد )
- خط اول برنامه ( using System ) است که کلید واژه ای است برای وارد کردن فضای نام سیستم به برنامه .
- خط دوم معرفی یک فضای نام است . فضای نام مجموعه ای از کلاس ها ست .
- خط سوم معرفی کلاس (HelloWorld) است . کلاس ها عموما دارای چندین متد می باشند . متدها رفتار کلاس را مشخص می کنند . در اینجا کلاس (HelloWorld) دارای متد (Main) یعنی متد اصلی برنامه می باشد.
- خط چهارم بیان متد (Main) است . متد (Main) جایی است که تمام برنامه های (#C) از آنجا شروع می شود .
- خط پنجم (/* --------- */) یک (Comments) یا توضیح است که کمپایلر آن را نادیده می گیرد .
- درخط ششم که در واقع رفتار متد (Main) را نشان می دهد ، (WriteLine) پیام (Hello World) را روی صفحه نمایش می دهد .
- در خط هفتم که شامل رفتار دیگری از متد (Main) است ، (ReadKey) باعث جلوگیری از بسته شدن سریع برنامه پس از اجرا می شود و برنامه را منتظر فشرده شدن کلیدی توسط کاربر نگه می دارد .
تذکر : تمام (statements) باید با یک ( ; ) به پایان برسند.
*** برخلاف جاوا نام برنامه می تواند با نام کلاس متفاوت باشد.
using System; namespace HelloWorldApplication
{ class HelloWorld { static void Main(string[] args)
{ /* my first program in C# */ Console.WriteLine("Hello World"); Console.ReadKey(); } } }