যদিও এটি একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ অজোনস্টিক প্রশ্ন হতে পারে তবে আমি নেট নেট ইকোসিস্টেমকে লক্ষ্য করে উত্তরগুলি দিতে আগ্রহী।
এই দৃশ্যটি: ধরুন আমাদের জনপ্রশাসনের জন্য একটি সাধারণ কনসোল অ্যাপ্লিকেশন বিকাশ করা উচিত। আবেদনটি যানবাহন শুল্ক সম্পর্কে। তাদের (কেবলমাত্র) নিম্নলিখিত ব্যবসায়িক বিধি রয়েছে:
১. ক) যদি গাড়িটি গাড়ি হয় এবং সর্বশেষ সময়টি তার মালিক 30 দিন আগে কর প্রদান করে থাকে তবে মালিককে আবার পরিশোধ করতে হবে।
১. বি) যানবাহনটি যদি মোটরবাইক হয় এবং owner০ দিন আগে তার মালিক যখন শেষবারের মতো কর প্রদান করেছিলেন তবে মালিককে আবার অর্থ প্রদান করতে হবে।
অন্য কথায়, আপনার যদি গাড়ী থাকে তবে আপনাকে প্রতি 30 দিন সময় দিতে হয় বা আপনার কাছে মোটরবাইক থাকলে আপনাকে প্রতি 60 দিন পরে দিতে হবে।
সিস্টেমের প্রতিটি গাড়ির জন্য, অ্যাপ্লিকেশনটির সেই নিয়মগুলি পরীক্ষা করা উচিত এবং সেই গাড়িগুলি (প্লেট নম্বর এবং মালিকের তথ্য) মুদ্রণ করা উচিত যা সেগুলি সন্তুষ্ট করে না।
আমি যা চাই তা হ'ল:
২. ক) সলিড নীতিগুলি (বিশেষত উন্মুক্ত / বদ্ধ নীতি) মেনে চলুন।
আমি যা চাই না তা হ'ল (আমার মনে হয়):
২. বি) অ্যানিমিক ডোমেন, সুতরাং ব্যবসায়ের যুক্তি ব্যবসায়ের সত্তার মধ্যে থাকা উচিত go
আমি এটি দিয়ে শুরু করেছি:
public class Person
// You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.
{
public string Name { get; set; }
public string Surname { get; set; }
}
public abstract class Vehicle
{
public string PlateNumber { get; set; }
public Person Owner { get; set; }
public DateTime LastPaidTime { get; set; }
public abstract bool HasToPay();
}
public class Car : Vehicle
{
public override bool HasToPay()
{
return (DateTime.Today - this.LastPaidTime).TotalDays >= 30;
}
}
public class Motorbike : Vehicle
{
public override bool HasToPay()
{
return (DateTime.Today - this.LastPaidTime).TotalDays >= 60;
}
}
public class PublicAdministration
{
public IEnumerable<Vehicle> GetVehiclesThatHaveToPay()
{
return this.GetAllVehicles().Where(vehicle => vehicle.HasToPay());
}
private IEnumerable<Vehicle> GetAllVehicles()
{
throw new NotImplementedException();
}
}
class Program
{
static void Main(string[] args)
{
PublicAdministration administration = new PublicAdministration();
foreach (var vehicle in administration.GetVehiclesThatHaveToPay())
{
Console.WriteLine("Plate number: {0}\tOwner: {1}, {2}", vehicle.PlateNumber, vehicle.Owner.Surname, vehicle.Owner.Name);
}
}
}
2.এ: ওপেন / বদ্ধ নীতিটি গ্যারান্টিযুক্ত; যদি তারা সাইকেল ট্যাক্স চান তবে আপনি কেবল যানবাহন থেকে উত্তরাধিকারী হন, তবে আপনি হ্যাসটোপে পদ্ধতিটি ওভাররাইড করবেন এবং আপনার কাজ শেষ। সাধারণ উত্তরাধিকারের মাধ্যমে সন্তুষ্ট / বন্ধ নীতি
"সমস্যাগুলি" হ'ল:
৩.এ) কেন কোনও যানবাহনকে তার মূল্য দিতে হবে তা জানতে হবে? পাবলিক অ্যাডমিনিস্ট্রেশন উদ্বেগ না? যদি জনপ্রশাসন গাড়ি ট্যাক্স পরিবর্তনের জন্য নিয়ম করে, তবে গাড়িটি কেন পরিবর্তন করতে হবে? আমার মনে হয় আপনার জিজ্ঞাসা করা উচিত: "তাহলে আপনি যানবাহনের ভিতরে কেন হ্যাশটোপে পদ্ধতি রেখেছেন?", এবং উত্তরটি হ'ল: কারণ আমি পাবলিক-অ্যাডমিনিস্ট্রেশনের ভিতরে যানবাহনের ধরণের (টাইপফ) পরীক্ষা করতে চাই না। আপনি কি আরও ভাল বিকল্প দেখতে পাচ্ছেন?
৩.বি) হয়তো কর প্রদানের বিষয়টি সর্বোপরি একটি গাড়ির উদ্বেগ, বা হতে পারে আমার প্রাথমিক ব্যক্তি-যানবাহন-গাড়ি-মোটরবাইক-পাবলিক অ্যাডমিনিস্ট্রেশন ডিজাইনটি কেবল সাধারণ ভুল, অথবা আমার একজন দার্শনিক এবং আরও ভাল ব্যবসায় বিশ্লেষক প্রয়োজন। একটি সমাধান হতে পারে: হ্যাসটোপে পদ্ধতিটিকে অন্য শ্রেণিতে স্থানান্তর করুন, আমরা এটিকে ট্যাক্সপমেন্ট বলতে পারি। তারপরে আমরা দুটি ট্যাক্স পেমেন্ট উদ্ভূত ক্লাস তৈরি করি; কারট্যাক্স পেমেন্ট এবং মোটরবাইকট্যাক্স পেমেন্ট। তারপরে আমরা যানবাহনের ক্লাসে একটি বিমূর্ত প্রদানের সম্পত্তি (কর প্রদেয় প্রকারের প্রকারের) যুক্ত করি এবং আমরা গাড়ী এবং মোটরবাইক শ্রেণি থেকে সঠিক কর প্রদানের দৃষ্টান্তটি ফিরিয়ে দিই:
public abstract class TaxPayment
{
public abstract bool HasToPay();
}
public class CarTaxPayment : TaxPayment
{
public override bool HasToPay()
{
return (DateTime.Today - this.LastPaidTime).TotalDays >= 30;
}
}
public class MotorbikeTaxPayment : TaxPayment
{
public override bool HasToPay()
{
return (DateTime.Today - this.LastPaidTime).TotalDays >= 60;
}
}
public abstract class Vehicle
{
public string PlateNumber { get; set; }
public Person Owner { get; set; }
public DateTime LastPaidTime { get; set; }
public abstract TaxPayment Payment { get; }
}
public class Car : Vehicle
{
private CarTaxPayment payment = new CarTaxPayment();
public override TaxPayment Payment
{
get { return this.payment; }
}
}
public class Motorbike : Vehicle
{
private MotorbikeTaxPayment payment = new MotorbikeTaxPayment();
public override TaxPayment Payment
{
get { return this.payment; }
}
}
এবং আমরা পুরানো প্রক্রিয়াটি এভাবেই প্রার্থনা করি:
public IEnumerable<Vehicle> GetVehiclesThatHaveToPay()
{
return this.GetAllVehicles().Where(vehicle => vehicle.Payment.HasToPay());
}
তবে এখন এই কোডটি সংকলন করবে না কার্ট্যাকপেসমেন্ট / মোটরবাইকট্যাক্স পেমেন্ট / ট্যাক্সপেমেন্টের ভিতরে লাস্টপেইডটাইম সদস্য নেই। আমি CarTaxPayment এবং মোটরবাইকট্যাক্স পেমেন্টটি ব্যবসায়ের সংস্থাগুলির চেয়ে "অ্যালগরিদম বাস্তবায়ন" এর মতো দেখতে আরও শুরু করি। কোনওভাবে এখন সেই "অ্যালগরিদমগুলি" লাস্টপেইডটাইমের মান প্রয়োজন। অবশ্যই, আমরা করের অর্থ পরিশোধের নির্মাতার কাছে মানটি পাস করতে পারি, তবে এটি যানবাহন আবরণ, বা দায়িত্বগুলি লঙ্ঘন করবে বা এই ওওপি প্রচারকরা যা বলুক না কেন, তা নয়?
3.c) ধরুন আমাদের ইতিমধ্যে একটি সত্ত্বা ফ্রেমওয়ার্ক অবজেক্ট কনটেক্সট (যা আমাদের ডোমেন অবজেক্ট ব্যবহার করে; ব্যক্তি, যানবাহন, গাড়ি, মোটরবাইক, পাবলিক অ্যাডমিনিস্ট্রেশন)। আপনি পাবলিকএডমিনিস্ট্রেশন.গেটএলভেলিক্স পদ্ধতি থেকে কোনও অবজেক্ট কনটেক্সট রেফারেন্স পেতে কীভাবে করতে পারেন এবং তাই চমত্কারতা বাস্তবায়ন করেন?
৩. ডি) আমাদের যদি কারট্যাক্সপেমেন্টের জন্য একই অবজেক্ট কনটেক্সট রেফারেন্সের প্রয়োজন হয় তবে হসটোপপে মোটরবাইকট্যাক্স পেমেন্টের জন্য আলাদা একটি। "ইনজেকশন" দেওয়ার দায়িত্বে থাকা হাসটপোপে বা কীভাবে আপনি এই রেফারেন্সগুলি পেমেন্ট ক্লাসে পাস করবেন? এই ক্ষেত্রে, একটি রক্তাল্পতা ডোমেন এড়ানো (এবং এইভাবে কোনও পরিষেবা সামগ্রী নেই), আমাদেরকে বিপর্যয়ের দিকে নিয়ে যায় না?
এই সাধারণ দৃশ্যের জন্য আপনার নকশার পছন্দগুলি কী কী? স্পষ্টতই আমি যে উদাহরণগুলি দেখিয়েছি তা একটি সহজ কাজের জন্য "খুব জটিল", তবে একই সাথে সলাইড নীতিগুলি মেনে চলা এবং রক্তাল্পতা (যাগুলির ধ্বংস করতে দেওয়া হয়েছে) প্রতিরোধ করা ধারণা।