البرمجة

تحسين هيكلة الشيفرة باستخدام استراتيجيات النقل في برمجة الرحلات

عند التفكير في تحسين هيكلة الشيفرة لتجنب استخدام التبديلات (switch cases)، يمكنك اللجوء إلى مفهوم يسمى “تصميم الاستراتيجية” (Strategy Design Pattern). يتيح لك هذا التصميم تحديد سلوك معين وتبديله دون تغيير الشيفرة الرئيسية. في هذا السياق، يمكنك إعداد فئات فرعية لكل وسيلة نقل، وتعريف واجهة مشتركة تحدد السلوك المطلوب، ثم استخدام هذه الفئات في الشيفرة الرئيسية.

لنقم بتفكيك الشيفرة وتحسينها، أولاً يجب عليك إنشاء واجهة تعريف السلوك المشترك بين جميع وسائل النقل. على سبيل المثال:

csharp
public interface ITransportationStrategy { decimal CalculateCost(double distance); }

ثم يمكنك تنفيذ هذه الواجهة في فئات فرعية لكل وسيلة نقل، مثلاً:

csharp
public class BicycleStrategy : ITransportationStrategy { public decimal CalculateCost(double distance) { return (decimal)(distance * 1); } } public class BusStrategy : ITransportationStrategy { public decimal CalculateCost(double distance) { return (decimal)(distance * 2); } } public class CarStrategy : ITransportationStrategy { public decimal CalculateCost(double distance) { return (decimal)(distance * 3); } }

بعد ذلك، يمكنك تعديل الفئة TransportationCostCalculator لاستخدام واجهة ITransportationStrategy بدلاً من استخدام switch case:

csharp
public class TransportationCostCalculator { private ITransportationStrategy strategy; public double DistanceToDestination { get; set; } public TransportationCostCalculator(ITransportationStrategy strategy) { this.strategy = strategy; } public decimal CostOfTravel() { return strategy.CalculateCost(DistanceToDestination); } }

أخيرًا، يمكنك تحديد الاستراتيجية المناسبة في البرنامج الرئيسي واستخدامها كالتالي:

csharp
class Program { static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Not enough arguments to run this program"); Console.ReadLine(); } else { var transportMethod = args[0]; var distance = double.Parse(args[1]); ITransportationStrategy strategy; switch (transportMethod) { case "Bicycle": strategy = new BicycleStrategy(); break; case "Bus": strategy = new BusStrategy(); break; case "Car": strategy = new CarStrategy(); break; default: throw new ArgumentOutOfRangeException(); } var calculator = new TransportationCostCalculator(strategy) { DistanceToDestination = distance }; var result = calculator.CostOfTravel(); Console.WriteLine(result); Console.ReadLine(); } } }

بهذا الشكل، يمكنك إضافة وسائل نقل إضافية دون التأثير على الشيفرة الرئيسية، مما يجعل البرنامج أكثر قابلية للصيانة والتطوير.

المزيد من المعلومات

بالطبع، دعنا نستكمل مشروع التحسين الذي بدأناه. يمكنك أيضًا تحسين برنامجك الرئيسي بمزيد من العمليات البسيطة والتنظيم لجعله أكثر فاعلية.

للبداية، يمكنك استخدام “منشئات الخدمة” (Service Providers) لتخزين الاستراتيجية بدلاً من استخدام التبديل الطويل في الكود الرئيسي. لذلك، قم بإنشاء واجهة لمزود الخدمة:

csharp
public interface ITransportationStrategyProvider { ITransportationStrategy GetStrategy(string transportMethod); }

ثم قم بتنفيذ هذه الواجهة في فئة تحتوي على قاعدة بيانات (في هذا السياق، محاكاة بسيطة):

csharp
public class TransportationStrategyProvider : ITransportationStrategyProvider { public ITransportationStrategy GetStrategy(string transportMethod) { switch (transportMethod) { case "Bicycle": return new BicycleStrategy(); case "Bus": return new BusStrategy(); case "Car": return new CarStrategy(); default: throw new ArgumentOutOfRangeException(); } } }

ثم يمكنك تحسين البرنامج الرئيسي لاستخدام هذا المزود:

csharp
class Program { static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Not enough arguments to run this program"); Console.ReadLine(); } else { var transportMethod = args[0]; var distance = double.Parse(args[1]); var serviceProvider = new TransportationStrategyProvider(); var strategy = serviceProvider.GetStrategy(transportMethod); var calculator = new TransportationCostCalculator(strategy) { DistanceToDestination = distance }; var result = calculator.CostOfTravel(); Console.WriteLine(result); Console.ReadLine(); } } }

بهذا الشكل، يمكنك بسهولة استبدال المنشئ الخدمي بآخر يستند إلى قاعدة بيانات حقيقية أو أي استراتيجية أخرى بدون التأثير على الشيفرة الرئيسية. يعزز هذا نظامك بمزيد من القابلية للتوسع والتخصيص.

زر الذهاب إلى الأعلى