استخدم دائما اسلوب تغليف الشروط والقواعد الشرطية
التغليف هو طريقه تساعد فى عزل التنفيذ عن السلوك الذى يتعرض له عناصر كلاس اخر
اسلوب خاطئ
if (website.state == "down")
{
// ...
}
اسلوب صحيح
if (website.IsDown())
{
// ...
}
كذلك يسمح التغليف بتحكم اكبر فى اقتران الكود المكتوب
لا تجعل العناصر والمتغيرات دائما معلن عنها للكلاسات الاخرى
وفعل ذلك يجعل العناصر الغير محمية معرضين للتعديل عن طريق الخطأ ولالذى يمكن ان يتسبب فى اخطاء فى الكود البرمجى
اسلوب خاطئ
class Car
{
public string Brand { get; set; }
public Car(string brand)
{
Brand = brand;
}
}
var car = new Car("Porsche");
Console.WriteLine(car.Brand); // Car brand: Porsche
اسلوب صحيح
class Car
{
public string Brand { get; }
public Car(string brand)
{
Brand = brand;
}
var car = new Car("Porsche");
Console.WriteLine(car.Brand); // Car brand: Porsche
وعلينا ان نضع فى الاعتبار اننا مسئولين عن الأذونات التى نعطيها للكود بمعنى انه اذا كان لديك متغير نصي للقراءة فقط وانت سمحت بالتعديل عليه فأنت المسئول اذا حدث خطأ
تعلم كيف يمكنك استخدام get- set
فى بعض الاوقات لا نستخدم public ,private, protected وهذا يمنعنا من التحكم بشكل أفضل فى تعديل خصائص الكائن او الكلاس
اسلوب خاطئ
class BankAccount
{
public double Balance = 5000;
}
var bankAccount = new BankAccount();
// Buy a cappuccino
bankAccount.Balance -= 15;
اسلوب صحيح
class BankAccount
{
private double _balance = 0.0D;
public double Balance {
get {
return _balance;
}
}
public BankAccount(balance = 1000)
{
_balance = balance;
}
public void WithdrawBalance(int amount)
{
if (amount > _balance)
{
throw new Exception('Amount greater than available balance.');
}
_balance -= amount;
}
public void DepositBalance(int amount)
{
_balance += amount;
}
}
var bankAccount = new BankAccount();
// Buy a cappuccino
bankAccount.WithdrawBalance(price: 15);
balance = bankAccount.Balance;
وعندما نريد ان نورث تلاك الفئه او الكلاس فأنه بشكل افتراضى يوجد امكانية لتجاوز تلك الوظيقة وهناك احتمالات كتير لذلك
التكوين افضل من التوريث
فىلا كثير من المواضع اثناء البرمجه كثير منا لا يعرف ان الثوريث ليس الحل الافضل ولكن هل سالت نفسك ايهما افضل, دعنى اخبرك ان التكوين افضل ولمعرفة ذلك دعنا نرى هذا المثال
اسلوب خاطئ
class Car
{
private string Model { get; set; }
private string Brand { get; set; }
public Car(string model, string brand)
{
Model = model;
Brand = brand;
}
// ...
}
// Bad because Car "have" engine data.
// CarEngineData is not a type of Car
class CarEngineData : Car
{
private string Model { get; set; }
private string Brand { get; set; }
public CarEngineData(string model, string brand, string displacement, string horses)
{
// ...
}
// ...
}
اسلوب صحيح
class CarEngineData
{
public string Displacement { get; }
public string Horses { get; }
public EmployeeTaxData(string displacement, string horses)
{
Displacement = displacement;
Horses = horses;
}
// ...
}
class Car
{
public string Model { get; }
public string Brand { get; }
public CarEngineData EngineData { get; }
public Car(string model, string brand)
{
Model = model;
Brand = brand;
}
public void SetEngine(string displacement, double horses)
{
EngineData = new CarEngineData(displacement, horses);
}
// ...
}
ومن المثال السابق نجد أن
العلاقة <<هى>> (الانسان- الحيوان)
العلاقة <<لديها>> (تفاصيل المستخدم- المستخدم)
حدد معاملات الدوال قبل ارسالها
public void ProtectApplication(string path, string configurationPath, string outPutPath, CancellationToken cancellationToken)
{
// ...
}
public class ProtectionConfig
{
public string Path { get; set; }
public string ConfigurationPath { get; set; }
public string OutPutPath { get; set; }
public CancellationToken cancellationToken { get; set; }
}
var config = new ProtectionConfig
{
Path = "./app.exe",
ConfigurationPath = "./shield.config.json",
OutPutPath = "./app_protected.exe",
CancellationToken = source.Token;
};
public void ProtectApplication(ProtectionConfig config)
{
// ...
}
تعليقات
إرسال تعليق