নিখুঁত ওওপি অ্যাপ্লিকেশন কীভাবে তৈরি করবেন [বন্ধ]


98

সম্প্রতি আমি একটি কোম্পানির জন্য চেষ্টা করছিলাম 'এক্স'। তারা আমাকে কিছু সেট পাঠিয়েছে এবং আমাকে কেবল একটি সমাধান করার জন্য বলেছে।

সমস্যাটি এরকম -

বুকস, খাবার এবং ছাড় প্রাপ্ত চিকিত্সা পণ্য ব্যতীত সমস্ত পণ্যগুলিতে 10% হারে বেসিক বিক্রয় কর প্রযোজ্য।
আমদানি শুল্ক একটি অতিরিক্ত বিক্রয় কর যা সমস্ত আমদানিকৃত পণ্যের উপর 5% হারে প্রযোজ্য, ছাড় ছাড়।

আমি যখন আইটেমগুলি কিনে থাকি তখন আমি একটি রশিদ পাই যা সমস্ত আইটেমের নাম এবং তাদের মূল্য (কর সহ) তালিকাভুক্ত করে, আইটেমগুলির মোট ব্যয় এবং শেষ পরিমাণে বিক্রয় ট্যাক্স প্রদান করে।
বিক্রয় করের রাউন্ডিংয়ের নিয়মগুলি হ'ল এন% ট্যাক্সের হারের জন্য, পি এর একটি শেল্ফ প্রাইসে বিক্রয় করের পরিমাণ (নিকটস্থ 0.05 পর্যন্ত গোল হয়) থাকে।

"তারা আমাকে বলেছিল, তারা আপনার সমাধানের ডিজাইন দিক সম্পর্কে আগ্রহী এবং আমার অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং দক্ষতা মূল্যায়ন করতে চাই ” "

তারা তাদের নিজস্ব কথায় এটি বলেছিল

  • সমাধানের জন্য, আমরা চাই আপনি জাভা, রুবি বা সি # ব্যবহার করুন।
  • আমরা আপনার সমাধানটির ডিজাইন সহায়তা সম্পর্কে আগ্রহী এবং আপনার অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং দক্ষতা মূল্যায়ন করতে চাই ।
  • আপনি নির্মাণ বা পরীক্ষার উদ্দেশ্যে বাহ্যিক গ্রন্থাগার বা সরঞ্জাম ব্যবহার করতে পারেন। বিশেষত, আপনি ইউনিট টেস্টিং লাইব্রেরি ব্যবহার করতে পারেন বা আপনার নির্বাচিত ভাষার জন্য উপলব্ধ সরঞ্জামগুলি তৈরি করতে পারেন (যেমন, জুনিত, পিঁপড়া, নুনিট, ন্যান্ট, টেস্ট :: ইউনিট, রেক ইত্যাদি)
  • Allyচ্ছিকভাবে, আপনি নিজের কোড সহ আপনার নকশা এবং অনুমানের একটি সংক্ষিপ্ত ব্যাখ্যাও অন্তর্ভুক্ত করতে পারেন।
  • দয়া করে নোট করুন যে আমরা কোনও ওয়েব-ভিত্তিক অ্যাপ্লিকেশন বা একটি বিস্তৃত UI আশা করি না। বরং আমরা একটি সাধারণ, কনসোল ভিত্তিক অ্যাপ্লিকেশন আশা করছি এবং আপনার উত্স কোডে আগ্রহী।

সুতরাং আমি কোডের নীচে সরবরাহ করেছি - আপনি কেবল পেস্ট কোডটি অনুলিপি করতে এবং ভিএস-তে চালাতে পারেন

class Program
 {
     static void Main(string[] args)
     {
         try
         {
             double totalBill = 0, salesTax = 0;
             List<Product> productList = getProductList();
             foreach (Product prod in productList)
             {
                 double tax = prod.ComputeSalesTax();
                 salesTax += tax;
                 totalBill += tax + (prod.Quantity * prod.ProductPrice);
                 Console.WriteLine(string.Format("Item = {0} : Quantity = {1} : Price = {2} : Tax = {3}", prod.ProductName, prod.Quantity, prod.ProductPrice + tax, tax));
             }
             Console.WriteLine("Total Tax : " + salesTax);
             Console.WriteLine("Total Bill : " + totalBill);                
        }
         catch (Exception ex)
         {
             Console.WriteLine(ex.Message);
         }
         Console.ReadLine();
     }

    private static List<Product> getProductList()
     {
         List<Product> lstProducts = new List<Product>();
         //input 1
         lstProducts.Add(new Product("Book", 12.49, 1, ProductType.ExemptedProduct, false));
         lstProducts.Add(new Product("Music CD", 14.99, 1, ProductType.TaxPaidProduct, false));
         lstProducts.Add(new Product("Chocolate Bar", .85, 1, ProductType.ExemptedProduct, false));

        //input 2
         //lstProducts.Add(new Product("Imported Chocolate", 10, 1, ProductType.ExemptedProduct,true));
         //lstProducts.Add(new Product("Imported Perfume", 47.50, 1, ProductType.TaxPaidProduct,true));

        //input 3
         //lstProducts.Add(new Product("Imported Perfume", 27.99, 1, ProductType.TaxPaidProduct,true));
         //lstProducts.Add(new Product("Perfume", 18.99, 1, ProductType.TaxPaidProduct,false));
         //lstProducts.Add(new Product("Headache Pills", 9.75, 1, ProductType.ExemptedProduct,false));
         //lstProducts.Add(new Product("Imported Chocolate", 11.25, 1, ProductType.ExemptedProduct,true));
         return lstProducts;
     }
 }

public enum ProductType
 {
     ExemptedProduct=1,
     TaxPaidProduct=2,
     //ImportedProduct=3
 }

class Product
 {
     private ProductType _typeOfProduct = ProductType.TaxPaidProduct;
     private string _productName = string.Empty;
     private double _productPrice;
     private int _quantity;
     private bool _isImportedProduct = false;

    public string ProductName { get { return _productName; } }
     public double ProductPrice { get { return _productPrice; } }
     public int Quantity { get { return _quantity; } }

    public Product(string productName, double productPrice,int quantity, ProductType type, bool isImportedProduct)
     {
         _productName = productName;
         _productPrice = productPrice;
         _quantity = quantity;
         _typeOfProduct = type;
         _isImportedProduct = isImportedProduct;
     }

    public double ComputeSalesTax()
     {
         double tax = 0;
         if(_isImportedProduct) //charge 5% tax directly
             tax+=_productPrice*.05;
         switch (_typeOfProduct)
         {
             case ProductType.ExemptedProduct: break;
             case ProductType.TaxPaidProduct:
                 tax += _productPrice * .10;
                 break;
         }
         return Math.Round(tax, 2);
         //round result before returning
     }
 }

আপনি ইনপুট আনমমনেট করতে পারেন এবং বিভিন্ন ইনপুট চালাতে পারেন।

আমি সমাধানটি সরবরাহ করেছিলাম তবে আমি প্রত্যাখ্যান করা হয়েছিল।

"তারা বলেছে, তারা আমাদের বর্তমান উন্মুক্ত অবস্থানের জন্য আমাকে বিবেচনা করতে পারছে না কারণ কোড সমাধান সন্তোষজনক নয়।"

এখানে অনুপস্থিত কি দয়া করে আমাকে গাইড করুন। এই সমাধান কি ভাল OOAD সমাধান নয়।
আমি কীভাবে আমার OOAD দক্ষতা উন্নত করতে পারি।
আমার সিনিয়ররা আরও বলেছে নিখুঁত OOAD অ্যাপ্লিকেশনটিও ব্যবহারিকভাবে কাজ করবে না।

ধন্যবাদ


4
সম্ভবত তারা প্রত্যাশা করেছিল যে আপনি একটি অঙ্কের পরিবর্তে উত্তরাধিকারের শ্রেণিবদ্ধতা ব্যবহার করে পণ্যের ধরণের মধ্যে পার্থক্য করবেন? (যদিও আমি মনে করি যে প্রদত্ত দৃশ্যের জন্য সেই পদ্ধতির পরিবর্তে বিশৃঙ্খলা হবে))
ডগলাস

আমার ধারণা হ'ল তারা আপনার সমাধানটি মিশ্রভাবে প্রত্যাখ্যান করেছে কারণ আপনি কোনও ইন্টারফেস সংজ্ঞায়িত করেন নি।
ক্রিস গেসলার

28
থাম্বের নিয়ম হিসাবে, যদি কেউ আপনাকে ওওপি দক্ষতা প্রদর্শনের জন্য একটি সাক্ষাত্কার পরিস্থিতিতে জিজ্ঞাসা করে তবে আপনার একটি সুইচ স্টেটমেন্ট ব্যবহার এড়াতে চেষ্টা করা উচিত - পরিবর্তে উত্তরাধিকারের স্তরক্রম ব্যবহার করুন।
জো

4
কোড পর্যালোচনা পোস্ট করা উচিত।
ডেরেক

আমি সেখানে পোস্ট করেছিলাম কিন্তু সেখানে ভাল সমাধান পেতে পারি নি। তবে অন্যরা আমার সহায়তার পরে কোডেপ্রজেক্ট / ক্যুয়েশনস / 332077/… আমার তৈরি সমাধানটি প্রত্যেকে দেখতে পাবে এখানে আপনি আমার নতুন কোডটিও খুঁজে পেতে পারেন।
সূর্যের

উত্তর:


246

প্রথমে ভাল স্বর্গগুলি আর্থিক হিসাব দ্বিগুণ করে নাদশমিক মধ্যে আর্থিক গণনা করুন ; এটা যে জন্য হয়. আর্থিক সমস্যা নয়, পদার্থবিজ্ঞানের সমস্যাগুলি সমাধান করতে ডাবল ব্যবহার করুন ।

আপনার প্রোগ্রামের প্রধান ডিজাইনের ত্রুটি হ'ল নীতিটি ভুল জায়গায় রয়েছে । কর গণনার দায়িত্বে কে? আপনি পণ্যকে করের গণনার দায়িত্বে রেখেছেন , কিন্তু আপনি যখন কোনও আপেল বা বই বা কোনও ওয়াশিং মেশিন কিনেছেন তখন আপনি যে জিনিসটি কিনে চলেছেন তা আপনি কতটা কর দিতে যাচ্ছেন তা বলার জন্য দায়বদ্ধ নয় এটা। আপনাকে বলার জন্য সরকারী নীতি দায়বদ্ধ। আপনার নকশাটি মূলত ওও ডিজাইনের নীতিটিকে ব্যাপকভাবে লঙ্ঘন করে যে বস্তুগুলি তাদের নিজস্ব উদ্বেগের জন্য দায়বদ্ধ হওয়া উচিত , অন্য কারও নয়। ওয়াশিং মেশিনের উদ্বেগটি হ'ল সঠিক পোশাক আমদানি শুল্ক না নিয়ে আপনার কাপড় ধোয়া washing যদি কর আইন পরিবর্তন হয়, আপনি পরিবর্তন করতে চান নাওয়াশিং মেশিন অবজেক্ট , আপনি পলিসি অবজেক্ট পরিবর্তন করতে চান ।

তাহলে, ভবিষ্যতে এই ধরণের সমস্যাগুলির কাছে কীভাবে যাবেন?

আমি সমস্যার বিবরণে প্রতিটি গুরুত্বপূর্ণ বিশেষ্যটি হাইলাইট করে শুরু করেছি:

বুকস , খাবার এবং ছাড় প্রাপ্ত চিকিত্সা পণ্য ব্যতীত সমস্ত পণ্যগুলিতে 10% হারে বেসিক বিক্রয় কর প্রযোজ্য । আমদানি শুল্ক একটি অতিরিক্ত হয় সেলস ট্যাক্স সব প্রযোজ্য আমদানি একটি এ হার 5% এর কোন সঙ্গে ছাড় । আমি যখন ক্রয় আইটেম আমি একটি গ্রহণ প্রাপ্তি যা তালিকাবদ্ধ করে নাম সব আইটেম এবং তাদের মূল্য (তত্সহ কর ), সঙ্গে শেষ হচ্ছে মোট খরচআইটেম এবং বিক্রয় করের মোট পরিমাণ । বিক্রয় করের রাউন্ডিংয়ের নিয়মগুলি হ'ল এন% ট্যাক্সের হারের জন্য, পি এর একটি শেল্ফ প্রাইসে বিক্রয় করের পরিমাণ (নিকটস্থ 0.05 পর্যন্ত গোল হয়) থাকে ।

এখন, এই সমস্ত বিশেষ্যগুলির মধ্যে কী সম্পর্ক?

  • বেসিক বিক্রয় কর এক প্রকার বিক্রয় কর
  • আমদানি শুল্ক এক প্রকার বিক্রয় কর
  • একটি বিক্রয় করের একটি হার থাকে যা দশমিক
  • বই এক ধরণের আইটেম
  • খাদ্য এক ধরণের আইটেম
  • মেডিকেল পণ্যগুলি এক ধরণের আইটেম
  • আইটেমগুলি আমদানিকৃত জিনিস হতে পারে
  • একটি আইটেমের একটি নাম রয়েছে যা একটি স্ট্রিং
  • একটি আইটেমের একটি শেল্ফ দাম থাকে যা দশমিক। (দ্রষ্টব্য: কোনও আইটেমটির কী সত্যিই দাম আছে? দুটি একই ধরণের ওয়াশিং মেশিন বিভিন্ন দোকানে বিভিন্ন দামে বা একই সময়ে বিভিন্ন সময়ে বিক্রয় হতে পারে A এর দাম।)
  • একটি বিক্রয় কর ছাড়ের নীতি এমন শর্তাদি বর্ণনা করে যার অধীনে কোন আইটেমটিতে বিক্রয় কর প্রযোজ্য নয়।
  • একটি প্রাপ্তির আইটেমগুলির তালিকা, দাম এবং তাদের কর রয়েছে।
  • একটি রসিদ মোট আছে
  • একটি প্রাপ্তির মোট ট্যাক্স রয়েছে

... ইত্যাদি। আপনার যদি সমস্ত বিশেষ্যগুলির মধ্যে সমস্ত সম্পর্ক তৈরি হয়ে যায় তবে আপনি একটি শ্রেণিবিন্যাসের নকশা শুরু করতে পারেন। একটি বিমূর্ত বেস শ্রেণি আইটেম আছে। বইটি এর উত্তরাধিকার সূত্রে প্রাপ্ত। সেলসট্যাক্সের একটি বিমূর্ত শ্রেণি রয়েছে; বেসিকসেলট্যাক্স এর উত্তরাধিকার সূত্রে প্রাপ্ত। ইত্যাদি।


12
সবেমাত্র কী সরবরাহ করা হয়েছিল তার চেয়ে বেশি আপনার দরকার? উত্তরাধিকার কীভাবে প্রয়োগ করা হয়, এবং পলিমারফিজম কী তা সম্পর্কে আপনার আরও শোনানো দরকার ounds
সিন্ধুস্টার

27
@ সন্দর: এই উত্তরটি যথেষ্টের চেয়ে বেশি। আপনার দক্ষতা বিকাশের এখন আপনার দায়িত্ব, সম্ভবত এটি প্রথম উদাহরণ হিসাবে ব্যবহার করুন। মনে রাখবেন যে আপনার উদাহরণটি বাস্তব জীবনের উদাহরণের সংজ্ঞা। আপনি একটি বাস্তব জীবনের সাক্ষাত্কার ব্যর্থ করেছেন কারণ এই বাস্তব জীবনের কোডটির জন্য এমন একটি বাস্তব জীবনের নকশা দরকার যা আপনি সরবরাহ করেন নি।
গ্রেগ ডি

9
@ নারায়ণ: doubleএমন পরিস্থিতিতে আদর্শ যেখানে সঠিক উত্তরের 0.00000001% এর মধ্যে থাকা যথেষ্টের চেয়ে বেশি। যদি আপনি বুঝতে চান যে অর্ধ সেকেন্ডের পরে কোনও ইটটি কীভাবে দ্রুত পড়ে যাচ্ছে, তবে গণিতটি দ্বিগুণ করুন। আপনি যখন ডাবলসে আর্থিক পাটিগণিত করেন আপনি ট্যাক্সের পরে মূল্য 43.79999999999999 ডলার এর মতো উত্তর দিয়ে শেষ করেন এবং এটি সঠিক উত্তরটির খুব কাছাকাছি থাকা সত্ত্বেও নির্বোধ দেখায়।
এরিক লিপার্ট

31
+1 আপনি একটি উল্লেখযোগ্য অনুশীলনকে হাইলাইট করেছেন, যা বর্ণিত সমস্যাটিতে প্রতিটি বিশেষ্য পরীক্ষা করা এবং তারপরে একে অপরের মধ্যে তাদের সম্পর্ককে অঙ্কিত করা। ভালো বুদ্ধি.
ক্রিস টংকিনসন

4
@ জর্দো: দশমিক হিসাবে, দশবার দশ বার যোগ করা 1.00 দেয়। তবে ১.০ / ৩৩৩.০ তিনশত ত্রিশ বার তিনবার যোগ করা অবশ্যই দশমিক বা দ্বিগুণ একটিতে দেয় না। দশমিক দশমিক, দশকগুলিতে দশটির শক্তি থাকা ভগ্নাংশগুলি হুবহু উপস্থাপিত হয়; দ্বিগুণে এটি দুটি শক্তির সাথে ভগ্নাংশ। অন্য যে কোনও কিছুই প্রায় উপস্থাপন করা হয়।
এরিক লিপার্ট

38

যদি সংস্থা ইউনাইট, জুনিত বা টেস্ট :: গ্রন্থাগার সম্পর্কে কিছু জানায় তবে ইউনিট সম্ভাব্যতার চেয়ে বেশি যে টিডিডি তাদের কাছে সত্যই আমদানি করে। আপনার কোডের নমুনায় কোনও পরীক্ষা নেই।

আমি এর ব্যবহারিক জ্ঞান প্রদর্শনের চেষ্টা করব:

  • ইউনিট পরীক্ষা (উদাহরণস্বরূপ NUnit)
  • উপহাস (উদাঃ রাইনোমকস)
  • অধ্যবসায় (উদা। এনহাইবারনেট)
  • আইওসি পাত্রে (উদাঃ এনএসপ্রিং)
  • নকশা নিদর্শন
  • সলিড নীতি

আমি www.dimecasts.net কে বিনামূল্যে, ভাল মানের স্ক্রিনকাস্টগুলির চিত্তাকর্ষক উত্স হিসাবে পুনরায় সংশোধন করতে চাই যা উপরে বর্ণিত সমস্ত বিষয়কে অন্তর্ভুক্ত করে।


19

এটি অত্যন্ত সাবজেক্টিভ তবে এখানে কয়েকটি পয়েন্ট যা আমি আপনার কোডটি তৈরি করব:

  • আমার মতে আপনি মিশ্র Productএবং ShoppingCartItemProductপণ্যের নাম, করের স্থিতি ইত্যাদি থাকা উচিত তবে পরিমাণের নয়। পরিমাণ কোনও পণ্যের সম্পত্তি নয় - এই নির্দিষ্ট পণ্যটি কিনে এমন সংস্থার প্রতিটি গ্রাহকের পক্ষে এটি আলাদা হবে।

  • ShoppingCartItemএকটি Productএবং পরিমাণ থাকতে হবে। এইভাবে গ্রাহক অবাধে একই পণ্য কম-বেশি কিনতে পারবেন। আপনার বর্তমান সেটআপ দিয়ে এটি সম্ভব নয়।

  • চূড়ান্ত করের গণনা করাও এর অংশ হওয়া উচিত নয় Product- এটি ShoppingCartচূড়ান্ত কর গণনায় কার্টের সমস্ত পণ্য জানার সাথে জড়িত থাকতে পারে এমন কিছু অংশ হওয়া উচিত ।


এই উত্তরের সাথে আমার একমাত্র সমস্যাটি হ'ল এটি কীভাবে আরও ভাল পণ্য প্রদানের ব্যবস্থাটি নির্ধারণ করতে পারে (যা বৈধ) তবে ওওপি পদ্ধতিগুলিতে প্রকৃতপক্ষে বিস্তৃত নয়। এটি যে কোনও ভাষায় প্রয়োগ করা যেতে পারে। কোনও ধরণের ইন্টারফেস, উত্তরাধিকার, পলিমারফিজম ইত্যাদি প্রদর্শন না করেও তিনি পরীক্ষায় ব্যর্থ হন।
টাইমআউট

শেষ পয়েন্টের উল্লেখে: ট্যাক্স গণনার জন্য আইএমওর সেরা স্থান হ'ল একক রেসোসিবিলিটি নীতির কারণে পৃথক ট্যাক্সক্যালকুলেটর শ্রেণি।
রাদেক

উত্তর দেওয়ার জন্য ধন্যবাদ তবে এটি কতটা অনুশীলনযোগ্য। প্রতিটি সংস্থার যেমন বিস্তৃত এবং খাঁটি OOPS মডেল কাজ করে।
সূর্যের

@ শ্যামসুন্দর আমার উত্তর সম্পর্কে সত্যিকারের শুদ্ধ কিছুই নেই। এটি ইন্টারফেস / উত্তরাধিকারগুলি ব্যবহার করে না যা ওওডির গুরুত্বপূর্ণ দিক, তবে এটি সর্বাধিক গুরুত্বপূর্ণ নীতিটি দেখায় - আমার মতে - এবং এটি তাদের যেখানে দায়িত্ব রয়েছে সেগুলিই রাখে। অন্যান্য উত্তরগুলি যেমন উল্লেখ করেছে, আপনার নকশার মূল সমস্যাটি হ'ল আপনি বিভিন্ন অভিনেতাদের মধ্যে দায়িত্ব মিশ্রিত করেছেন এবং বৈশিষ্ট্যগুলি যুক্ত করার সময় সমস্যা দেখা দেবে। বেশিরভাগ বৃহত সফ্টওয়্যার কেবল তখনই বৃদ্ধি পেতে পারে যদি তারা এই নীতিগুলি অনুসরণ করে।
xxbbcc

উত্তম উত্তর তবে আমি সম্মতও হই যে করের গণনা একটি পৃথক বস্তু হওয়া উচিত।

14

প্রথমত, এটি একটি খুব ভাল সাক্ষাত্কার প্রশ্ন। এটি অনেক দক্ষতার একটি ভাল গেজ ।

উচ্চ-স্তরের এবং নিম্ন-স্তরের, একটি ভাল উত্তর সরবরাহ করার জন্য আপনাকে অনেকগুলি বিষয় বুঝতে হবে ( কোনও সঠিক উত্তর নেই)। এখানে কয়েকজন রয়েছেন:

  • ডোমেন মডেলিং -> আপনি কীভাবে সমাধানটির একটি ভাল মডেল তৈরি করবেন? আপনি কোন বস্তু তৈরি করেন? কীভাবে তারা প্রয়োজনীয়তাগুলি সমাধান করবে? বিশেষ্যগুলির সন্ধান করা একটি ভাল শুরু, তবে আপনি কীভাবে সিদ্ধান্ত নেবেন যে আপনার সত্তাগুলির পছন্দ ভাল? কি অন্যান্য সত্ত্বা আপনার কি মত? এটির সমাধান করার জন্য আপনার কোন ডোমেন জ্ঞান দরকার?
  • উদ্বেগের পৃথকীকরণ, আলগা সংযোগ, উচ্চ সংহতি -> আপনি কীভাবে ডিজাইনের বিভিন্ন অংশগুলি আলাদা করেন যা বিভিন্ন উদ্বেগ বা পরিবর্তনের হার রয়েছে এবং আপনি কীভাবে এটি সম্পর্কিত? আপনি কীভাবে আপনার নকশাকে নমনীয় এবং বর্তমান রাখেন?
  • ইউনিট টেস্টিং, রিফ্যাক্টরিং, টিডিডি -> সমাধান নিয়ে আসার জন্য আপনার প্রক্রিয়াটি কী ? আপনি কি পরীক্ষা লিখেন, মক অবজেক্টস, রিফ্যাক্টর, পুনরাবৃত্তি ব্যবহার করেন?
  • সাফ কোড, ভাষা আইডিয়াম -> আপনি কি আপনার প্রোগ্রামিং ভাষার বৈশিষ্ট্যগুলি আপনাকে সাহায্য করতে ব্যবহার করেন? আপনি কি বোধগম্য কোড লিখবেন? আপনার বিমূর্তকরণের স্তরগুলি কী বোঝায়? কোডটি কীভাবে বজায় রাখা যায়?
  • সরঞ্জামসমূহ : আপনি উত্স নিয়ন্ত্রণ ব্যবহার করেন? সরঞ্জাম তৈরি? আইডিই?

সেখান থেকে আপনি নকশা নীতিগুলি (SOLID নীতিগুলির মতো), ডিজাইন নিদর্শন, বিশ্লেষণের ধরণ, ডোমেন মডেলিং, প্রযুক্তির পছন্দ, ভবিষ্যতের বিবর্তন পথগুলি (যেমন আমি কোনও ডাটাবেস, বা একটি সমৃদ্ধ UI স্তর যুক্ত করি তবে জড়িত অনেক আকর্ষণীয় আলোচনা করতে পারেন, কী পরিবর্তন করতে হবে?), বাণিজ্য-অফস, অ-কার্যকরী প্রয়োজনীয়তা (কার্য সম্পাদন, রক্ষণাবেক্ষণযোগ্যতা, সুরক্ষা, ...), গ্রহণযোগ্যতা পরীক্ষা ইত্যাদি testing

আপনার সমাধানটি কীভাবে পরিবর্তন করা উচিত সে সম্পর্কে আমি মন্তব্য করব না, কেবল এই ধারণাগুলিতে আপনার আরও ফোকাস করা উচিত।

তবে, আমি আপনাকে (আংশিকভাবে) কীভাবে এই সমস্যাটি সমাধান করেছি , কেবল উদাহরণ হিসাবে (জাভাতে) আপনাকে দেখাতে পারি। অল্পক্ষণের Programবর্গ দেখতে এটা সব কিভাবে এই প্রাপ্তি মুদ্রণ করতে একসঙ্গে আসে:

------------------ এটি আপনার আদেশ ------------------
(001) ডোমেন চালিত নকশা ----- $ 69.99
(001) ক্রমবর্ধমান অবজেক্ট ওরিয়েন্টড সফ্টওয়্যার ----- $ 49.99
(001) হাউসের এমডি মরসুম 1 ----- $ 29.99
(001) হাউস এমডি মরসুম 7 ----- $ 34.50
(আইএমডি) ক্রমবর্ধমান অবজেক্ট ওরিয়েন্টেড সফ্টওয়্যার ----- $ 2.50
(বিএসটি) হাউজের এমডি মরসুম 1 ----- $ 3.00
(বিএসটি) হাউজের এমডি মরসুম 7 ----- $ 3.45
(আইএমডি) হাউসের এমডি মরসুম 7 ----- $ 1.73
                                সাব-মোট ----- 4 184.47
                                কর মোট ----- $ 10.68
                                    মোট ----- $ 195.15
---------------- আমাদের পছন্দ করার জন্য ধন্যবাদ ----------------

আপনার অবশ্যই এই বইগুলি একবার দেখে নেওয়া উচিত :-)

যেমনটি একটি সতর্কতামূলক: আমার সমাধানটি এখনও খুব অসম্পূর্ণ, আমি আরও ভাল ভিত্তি গড়ে তুলতে সুখী পথের দৃশ্যের দিকে মনোনিবেশ করেছি।


আমি আপনার সমাধানটি পেরেছি এবং এটি বেশ আকর্ষণীয় পেয়েছি। যদিও আমি অনুভব করি যে একটি আদেশ পুনরায় মুদ্রণের জন্য অর্ডার শ্রেণি দায়বদ্ধ হওয়া উচিত নয়। একইভাবে, কর গণনা করার জন্য ট্যাক্সমেথোদ শ্রেণিকে দায়বদ্ধ করা উচিত নয়। এছাড়াও, ট্যাক্সমেথডপ্যাকটিসে ট্যাক্সমেথডের একটি তালিকা থাকা উচিত নয়। পরিবর্তে, সেলস পলিসি নামে একটি শ্রেণীর এই তালিকা থাকা উচিত। সেলসইঙ্গাইন নামে একটি শ্রেণি একটি বিক্রয়পলিসি, একটি আদেশ এবং একটি ট্যাক্সক্যালকুলেটর পাস করতে হবে। সেলসইঙ্গাইন অর্ডারে থাকা আইটেমগুলিতে সেলস পলিসি প্রয়োগ করবে এবং ট্যাক্সক্যালকুলেটর ব্যবহার করে কর গণনা করবে
সি কেইং

@ বট: আকর্ষণীয় পর্যবেক্ষণ .... এখনই, Orderরসিদটি মুদ্রণ করে তবে Receiptএর নিজস্ব ফর্ম্যাটিং সম্পর্কে জানে। এছাড়াও, ট্যাক্সমেথডপ্যাকটিস হ'ল একধরণের ট্যাক্স নীতি, এটি একটি নির্দিষ্ট দৃশ্যে প্রযোজ্য সমস্ত ট্যাক্স ধারণ করে। TaxMethods হয় ট্যাক্স ক্যালকুলেটর। আমি অনুভব করি যে আপনি কেবলমাত্র প্রস্তাবিত বিক্রয়কেশিনের মতো কিছু উচ্চ স্তরের বাইন্ডিং ক্লাস মিস করছেন। এটি একটি আকর্ষণীয় ধারণা।
জর্দো

আমি কেবল অনুভব করি যে প্রতিটি শ্রেণীর অবশ্যই একটি একক সুস্পষ্ট সংজ্ঞাবদ্ধ দায়িত্ব থাকতে হবে এবং যে শ্রেণীগুলি বাস্তব বিশ্বের বস্তুর প্রতিনিধিত্ব করে তাদের এমন একটি ফ্যাশনে আচরণ করা উচিত যা বাস্তব বিশ্বের সাথে সামঞ্জস্যপূর্ণ। এই বিষয়ে একটি ট্যাক্সমেথোদকে দুটি শ্রেণিতে বিভক্ত করা যেতে পারে। একটি ট্যাক্সক্রিটেরিয়া এবং একটি ট্যাক্সক্যালকুলেটর। একইভাবে একটি আদেশ অবশ্যই একটি রসিদ মুদ্রণ করতে হবে না। একজন রসিদ জেনারেটর একটি রসিদ উত্পন্ন করার জন্য একটি রসিদ পাস করতে হবে।
সিকিং

@ বট: আমি পুরোপুরি একমত! ভাল ডিজাইন সলিড ! একজন TaxMethod হয় একটি ট্যাক্স ক্যালকুলেটর, এবং একটি TaxEligibilityCheck হয় একটি ট্যাক্স মানদণ্ড। তারা পৃথক সত্তা। প্রাপ্তি হিসাবে, হ্যাঁ, উত্পাদক অংশ বিভক্তকরণ আরও নকশা উন্নত করতে পারে।
জর্দো

4
সেই ধারণাটি স্পেসিফিকেশন প্যাটার্ন থেকে এসেছে , একবার দেখুন!
জর্দো

12

আপনি পণ্য নামে পরিচিত একটি শ্রেণি ব্যবহার করছেন তা বাদ দিয়ে, আপনি উত্তরাধিকার কী তা জানেন তা আপনি প্রমাণ করেননি, আপনি পণ্য থেকে একাধিক শ্রেণিবদ্ধ উত্তরাধিকার তৈরি করেন নি, কোনও পলিমারফিজম তৈরি করেন নি। একাধিক ওওপি ধারণা ব্যবহার করেও সমস্যার সমাধান করা যেত (এমনকি আপনি কেবল সেগুলি জানেন তা বোঝাতে)। এটি একটি ইন্টারভিউ সমস্যা তাই আপনি কতটা জানেন তা আপনি প্রদর্শন করতে চান।

আমি এখনই হতাশায় পরিণত হবে না। আপনি এখানে তাদের প্রদর্শন করেননি এর অর্থ এই নয় যে আপনি ইতিমধ্যে তাদের জানেন না বা তাদের শিখতে সক্ষম নন।

ওওপি বা সাক্ষাত্কারগুলির সাথে আপনার কেবল আরও কিছু অভিজ্ঞতার প্রয়োজন।

শুভকামনা!


আসলে এটি আমার প্রথম নকশা ছিল, আমি অন্যটি তৈরি করেছি তবে চরিত্রের সীমা অতিক্রম করায় আপনাকে দেখাতে পারছি না।
সুন্দর

আপনি কোন উদাহরণের সাহায্যে এটি প্রদর্শন করতে পারেন?
সূর্যের

@ সন্দর: আপনি নিজের নতুন ডিজাইন দিয়ে প্রশ্নটি আপডেট করতে পারেন।
بجার্ক ফ্রুন্ড-হানসেন

10

ওওপি দিয়ে প্রোগ্রামিং শিখতে শুরু করা লোকদের এর অর্থ কী তা বোঝার জন্য বড় সমস্যা হয় না, কারণ এটি বাস্তব জীবনের মতোই । ওওর তুলনায় আপনার যদি অন্যান্য প্রোগ্রামিং ফ্যামিলির সাথে দক্ষতা থাকে তবে এটি বোঝা আরও কঠিন হতে পারে।

সবার আগে, আপনার স্ক্রিনটি অফ করুন, বা আপনার প্রিয় আইডিই থেকে প্রস্থান করুন। একটি নিন কাগজ এবং পেন্সিল এবং একটি তালিকা তৈরি করুন সত্ত্বা , সম্পর্ক , মানুষ , মেশিন , প্রক্রিয়া , কাপড় ইত্যাদি সবকিছু যা আপনার চূড়ান্ত প্রোগ্রামে সম্মুখীন করা যেতে পারে।

দ্বিতীয়ত, বিভিন্ন বেসিক সত্তা পেতে চেষ্টা করুন । আপনি বুঝতে পারবেন যে কেউ কেউ সম্পত্তি বা ক্ষমতা ভাগ করতে পারে, আপনাকে এটি বিমূর্ত বস্তুতে রাখতে হবে । আপনার প্রোগ্রামের একটি দুর্দান্ত স্কিমা আঁকা শুরু করা উচিত।

এর পরে আপনাকে fonctionnalities (পদ্ধতি, ফাংশন, subroutines, এটি আপনি চান হিসাবে কল করতে হবে): উদাহরণস্বরূপ, একটি পণ্য অবজেক্ট বিক্রয় কর গণনা করতে সক্ষম হবে না । একটি বিক্রয় ইঞ্জিন বস্তু উচিত।

সমস্ত বড় শব্দ ( ইন্টারফেস , বৈশিষ্ট্য , পলিমারফিজম , heritage তিহ্য , ইত্যাদি) এবং প্রথম বারে নকশার নিদর্শনগুলির সাথে ঝামেলা অনুভব করবেন না , এমনকি সুন্দর কোড বা যা কিছু বানানোর চেষ্টা করবেন না ... কেবল সরল অবজেক্টগুলিতে চিন্তা করুন এবং মধ্যে interractions এটা বাস্তব জীবনে যেমন

এরপরে, এ সম্পর্কে কিছু গুরুতর সংক্ষিপ্ত সাহিত্য পড়ার চেষ্টা করুন। আমি মনে করি উইকিপিডিয়া এবং উইকিউইবুকগুলি শুরু করার একটি খুব ভাল উপায় এবং তারপরে কেবলমাত্র জিএফ এবং ডিজাইন প্যাটার্নস এবং ইউএমএল সম্পর্কে স্টাফগুলি পড়ুন ।


4
"সবার আগে আপনার স্ক্রিনটি বন্ধ করুন" এর জন্য +1 আমি মনে করি কম্পিউটিংয়ের শক্তির জন্য চিন্তাভাবনার শক্তি প্রায়শই ভুল হয়ে যায়।
কনটুর

4
পেন্সিল এবং কাগজ ব্যবহারের সহজ পদ্ধতির জন্য +1। আইডিই এর সামনে বসে অনেক সময় লোকেরা বিভ্রান্ত হন :)
নীরজ গুলিয়া

কিছু বিজ্ঞানী বলেছিলেন যে পর্দা দেখার সময় আমাদের মস্তিষ্ক অমনোযোগী হয়। আমি যখন সফ্টওয়্যার আর্কিটেকচার ডিজাইন অধ্যয়ন করি তখন আমাদের শিক্ষক আমাদের কাগজে কাজ করে তোলে। তিনি শক্তিশালী ইউএমএল সফ্টওয়্যার নিয়ে কিছু মনে করেন না। গুরুত্বপূর্ণ বিষয়গুলি হল প্রথমে বিষয়গুলি বোঝা।
সমালোচনা

4

প্রথমে Productপ্রাপ্তি ( ShoppingCart) শ্রেণীর সাথে শ্রেণিটি মিশ্রিত করবেন না , এটি ( ) এর quantityঅংশ হওয়া উচিত , পাশাপাশি & । & অংশ হওয়া উচিত ।ReceipItemShoppingCartItemTaxCostTotalTaxTotalCostShoppingCart

আমার Productবর্গ, আছে শুধুমাত্র Name& Price& কিছু কেবলমাত্র বৈশিষ্ট্য মত IsImported:

class Product
{
    static readonly IDictionary<ProductType, string[]> productType_Identifiers = 
        new Dictionary<ProductType, string[]>
        {
            {ProductType.Food, new[]{ "chocolate", "chocolates" }},
            {ProductType.Medical, new[]{ "pills" }},
            {ProductType.Book, new[]{ "book" }}
        };

    public decimal ShelfPrice { get; set; }

    public string Name { get; set; }

    public bool IsImported { get { return Name.Contains("imported "); } }

    public bool IsOf(ProductType productType)
    {
        return productType_Identifiers.ContainsKey(productType) &&
            productType_Identifiers[productType].Any(x => Name.Contains(x));
    }
}

class ShoppringCart
{
    public IList<ShoppringCartItem> CartItems { get; set; }

    public decimal TotalTax { get { return CartItems.Sum(x => x.Tax); } }

    public decimal TotalCost { get { return CartItems.Sum(x => x.Cost); } }
}

class ShoppringCartItem
{
    public Product Product { get; set; }

    public int Quantity { get; set; }

    public decimal Tax { get; set; }

    public decimal Cost { get { return Quantity * (Tax + Product.ShelfPrice); } }
}

আপনার ট্যাক্স গণনার অংশটি মিলিত হয়েছে Product। একটি পণ্য কর নীতিগুলি এর ট্যাক্স শ্রেণীর সংজ্ঞা দেয় না। সমস্যার বর্ণনার ভিত্তিতে দুটি ধরণের বিক্রয় কর: Basicএবং Dutyকর রয়েছে of আপনি Template Method Design Patternএটি অর্জন করতে ব্যবহার করতে পারেন :

abstract class SalesTax
{
    abstract public bool IsApplicable(Product item);
    abstract public decimal Rate { get; }

    public decimal Calculate(Product item)
    {
        if (IsApplicable(item))
        {
            //sales tax are that for a tax rate of n%, a shelf price of p contains (np/100)
            var tax = (item.ShelfPrice * Rate) / 100;

            //The rounding rules: rounded up to the nearest 0.05
            tax = Math.Ceiling(tax / 0.05m) * 0.05m;

            return tax;
        }

        return 0;
    }
}

class BasicSalesTax : SalesTax
{
    private ProductType[] _taxExcemptions = new[] 
    { 
        ProductType.Food, ProductType.Medical, ProductType.Book 
    };

    public override bool IsApplicable(Product item)
    {
        return !(_taxExcemptions.Any(x => item.IsOf(x)));
    }

    public override decimal Rate { get { return 10.00M; } }
}

class ImportedDutySalesTax : SalesTax
{
    public override bool IsApplicable(Product item)
    {
        return item.IsImported;
    }

    public override decimal Rate { get { return 5.00M; } }
}

এবং অবশেষে একটি শ্রেণি কর প্রয়োগ করার জন্য:

class TaxCalculator
{
    private SalesTax[] _Taxes = new SalesTax[] { new BasicSalesTax(), new ImportedDutySalesTax() };

    public void Calculate(ShoppringCart shoppringCart)
    {
        foreach (var cartItem in shoppringCart.CartItems)
        {
            cartItem.Tax = _Taxes.Sum(x => x.Calculate(cartItem.Product));
        }

    }
}

আপনি মাইফিডেলে এগুলি ব্যবহার করে দেখতে পারেন ।


2

নকশার নিয়ম সম্পর্কে খুব ভাল সূচনা পয়েন্ট হ'ল সলিড নীতি।

উদাহরণস্বরূপ ওপেন ক্লোজড নীতিতে বলা হয়েছে যে আপনি যদি নতুন কার্যকারিতা যুক্ত করতে চান তবে আপনাকে বিদ্যমান শ্রেণিতে কোড যুক্ত করতে হবে না, বরং নতুন ক্লাস যুক্ত করতে হবে।

আপনার নমুনা প্রয়োগের জন্য এর অর্থ হ'ল নতুন বিক্রয় কর যুক্ত করতে নতুন শ্রেণি যুক্ত করা দরকার। নিয়মের ব্যতিক্রম হ'ল বিভিন্ন পণ্যগুলির ক্ষেত্রেও এটি একই রকম।

রাউন্ডিং বিধি স্পষ্টতই পৃথক শ্রেণিতে যায় - একক দায়িত্বের নীতিতে বলা হয় যে প্রতিটি শ্রেণীর একক দায়িত্ব থাকে।

আমি মনে করি কোডটি লেখার চেষ্টা করা নিজেই একটি ভাল সমাধান লিখে এখানে পেস্ট করার চেয়ে আরও বেশি উপকার নিয়ে আসবে।

নিখুঁত ডিজাইন করা প্রোগ্রামটি লেখার জন্য একটি সাধারণ অ্যালগরিদম হ'ল:

  1. এমন কিছু কোড লিখুন যা সমস্যার সমাধান করে
  2. কোডটি SOLID নীতিগুলি মেনে চলে কিনা তা পরীক্ষা করে দেখুন
  3. গোটো 1 এর চেয়ে বিধি লঙ্ঘন হলে।

2

একটি নিখুঁত ওওপি বাস্তবায়ন সম্পূর্ণ বিতর্কযোগ্য। আপনার প্রশ্নে আমি যা দেখছি সেগুলি থেকে আপনি চূড়ান্ত মূল্য যেমন পণ্য, কর, প্রোডাক্টডিবি ইত্যাদি গণনা করতে যে ভূমিকা পালন করেন তার উপর ভিত্তি করে আপনি কোডটি আধুনিকীকরণ করতে পারেন।

  1. Productএকটি বিমূর্ত শ্রেণি হতে পারে এবং বই, খাবারের মতো উত্সযুক্ত ধরণের থেকে এটি উত্তরাধিকার সূত্রে প্রাপ্ত হতে পারে। কর প্রয়োগের সিদ্ধান্তটি উদ্ভূত প্রকারের দ্বারা সিদ্ধান্ত নেওয়া যেতে পারে। পণ্যটি বলবে যে করটি প্রযোজ্য কিনা তা উদ্ভূত শ্রেণীর উপর নির্ভর করে।

  2. TaxCriteria একটি এনাম হতে পারে এবং এটি ক্রয়ের সময় নির্দিষ্ট করা যেতে পারে (আমদানি করা, বিক্রয় করের প্রয়োগযোগ্যতা)।

  3. Taxশ্রেণীর উপর ভিত্তি করে কর গণনা করা হবে TaxCriteria

  4. এক্সএক্সবিবিসিসিরShoppingCartItem পরামর্শ অনুসারে একটি পণ্য এবং করের দৃষ্টান্তগুলি encapsulate করতে পারে এবং পরিমাণ, করের সাথে মোট মূল্য ইত্যাদির সাথে পণ্যের বিবরণ পৃথক করার এক দুর্দান্ত উপায় is

শুভকামনা।


1

কঠোরভাবে OOA / D দৃষ্টিকোণ থেকে, আমি দেখতে পাচ্ছি একটি বড় বিষয় হ'ল আপনার বেশিরভাগ শ্রেণির গুণাবলীতে গুণাবলীর নামে শ্রেণীর অপ্রয়োজনীয় নাম রয়েছে। যেমন পণ্য মূল্য, পণ্য থেকে টাইপ করুন । এই ক্ষেত্রে, আপনি এই শ্রেণিটি যে কোনও জায়গায় ব্যবহার করেন আপনার অত্যধিক ভারবোজ এবং কিছুটা বিভ্রান্তিকর কোড থাকবে, যেমন product.productName। আপনার গুণাবলী থেকে অপ্রয়োজনীয় শ্রেণীর নাম উপসর্গ / প্রত্যয়গুলি সরান।

এছাড়াও, আমি প্রশ্নে জিজ্ঞাসা করা অনুযায়ী রসিদ ক্রয় এবং তৈরি করার সাথে সম্পর্কিত কোনও ক্লাস দেখিনি।


1

পণ্য, কর ইত্যাদির জন্য ওও প্যাটার্নের একটি দুর্দান্ত উদাহরণ এখানে ... ওও ডিজাইনে প্রয়োজনীয় ইন্টারফেসের ব্যবহারটি লক্ষ্য করুন।

http://www.dreamincode.net/forums/topic/185426- ডিজাইন- প্যাটার্নস- স্ট্রেটজি /


4
আমি পণ্যটিকে একটি ইন্টারফেস তৈরির চেয়ে একটি (বিমূর্ত) শ্রেণি তৈরি করতে পছন্দ করব। আমি প্রতিটি পণ্য পৃথক শ্রেণি করতে হবে না। সর্বাধিক আমি প্রতি বিভাগে একটি শ্রেণি তৈরি করব।
কোডসইনচাউস

@ কোডইনচাউস - বেশিরভাগ সময় আপনার উভয়ের প্রয়োজন হয় তবে আপনি যদি একজন স্থপতি হিসাবে কোনও কাজ করার চেষ্টা করছেন তবে আমি ইন্টারফেসগুলি একটি অ্যাবস্ট্রাক্ট ক্লাসের মাধ্যমে প্রয়োগ করতে বেছে নেব।
ক্রিস Gessler

4
এই উদাহরণে ইন্টারফেসগুলির মোটেই কোনও বুদ্ধি নেই। এগুলি প্রয়োগ করে প্রতিটি শ্রেণিতে কেবল কোড নকল করতে পারে ation প্রতিটি শ্রেণি এটি একইভাবে প্রয়োগ করে।
পাইওটর পেরাক

0

ভিজিটর প্যাটার্নটি ব্যবহার করে কর সমস্যার সাথে ব্যয়কে আক্রমণ করেছে।

public class Tests
    {
        [SetUp]
        public void Setup()
        {
        }

        [Test]
        public void Input1Test()
        {
            var items = new List<IItem> {
                new Book("Book", 12.49M, 1, false),
                new Other("Music CD", 14.99M, 1, false),
                new Food("Chocolate Bar", 0.85M, 1, false)};

            var visitor = new ItemCostWithTaxVisitor();

            Assert.AreEqual(12.49, items[0].Accept(visitor));
            Assert.AreEqual(16.49, items[1].Accept(visitor));
            Assert.AreEqual(0.85, items[2].Accept(visitor));
        }

        [Test]
        public void Input2Test()
        {
            var items = new List<IItem> {
                new Food("Bottle of Chocolates", 10.00M, 1, true),
                new Other("Bottle of Perfume", 47.50M, 1, true)};

            var visitor = new ItemCostWithTaxVisitor();

            Assert.AreEqual(10.50, items[0].Accept(visitor));
            Assert.AreEqual(54.65, items[1].Accept(visitor));
        }

        [Test]
        public void Input3Test()
        {
            var items = new List<IItem> {
                new Other("Bottle of Perfume", 27.99M, 1, true),
                new Other("Bottle of Perfume", 18.99M, 1, false),
                new Medicine("Packet of headache pills", 9.75M, 1, false),
                new Food("Box of Chocolate", 11.25M, 1, true)};

            var visitor = new ItemCostWithTaxVisitor();

            Assert.AreEqual(32.19, items[0].Accept(visitor));
            Assert.AreEqual(20.89, items[1].Accept(visitor));
            Assert.AreEqual(9.75, items[2].Accept(visitor));
            Assert.AreEqual(11.80, items[3].Accept(visitor));
        }
    }

    public abstract class IItem : IItemVisitable
    { 
        public IItem(string name,
            decimal price,
            int quantity,
            bool isImported)
            {
                Name = name;
                Price = price;
                Quantity = quantity;
                IsImported = isImported;
            }

        public string Name { get; set; }
        public decimal Price { get; set; }
        public int Quantity { get; set; }
        public bool IsImported { get; set; }

        public abstract decimal Accept(IItemVisitor visitor);
    }

    public class Other : IItem, IItemVisitable
    {
        public Other(string name, decimal price, int quantity, bool isImported) : base(name, price, quantity, isImported)
        {
        }

        public override decimal Accept(IItemVisitor visitor) => Math.Round(visitor.Visit(this), 2);
    }

    public class Book : IItem, IItemVisitable
    {
        public Book(string name, decimal price, int quantity, bool isImported) : base(name, price, quantity, isImported)
        {
        }

        public override decimal Accept(IItemVisitor visitor) => Math.Round(visitor.Visit(this),2);
    }

    public class Food : IItem, IItemVisitable
    {
        public Food(string name, decimal price, int quantity, bool isImported) : base(name, price, quantity, isImported)
        {
        }

        public override decimal Accept(IItemVisitor visitor) => Math.Round(visitor.Visit(this), 2);
    }

    public class Medicine : IItem, IItemVisitable
    {
        public Medicine(string name, decimal price, int quantity, bool isImported) : base(name, price, quantity, isImported)
        {
        }

        public override decimal Accept(IItemVisitor visitor) => Math.Round(visitor.Visit(this), 2);
    }

    public interface IItemVisitable
    {
        decimal Accept(IItemVisitor visitor);
    }

    public class ItemCostWithTaxVisitor : IItemVisitor
    {
        public decimal Visit(Food item) => CalculateCostWithTax(item);

        public decimal Visit(Book item) => CalculateCostWithTax(item);

        public decimal Visit(Medicine item) => CalculateCostWithTax(item);

        public decimal CalculateCostWithTax(IItem item) => item.IsImported ?
            Math.Round(item.Price * item.Quantity * .05M * 20.0M, MidpointRounding.AwayFromZero) / 20.0M + (item.Price * item.Quantity)
            : item.Price * item.Quantity;

        public decimal Visit(Other item) => item.IsImported ?
            Math.Round(item.Price * item.Quantity * .15M * 20.0M, MidpointRounding.AwayFromZero) / 20.0M + (item.Price * item.Quantity)
            : Math.Round(item.Price * item.Quantity * .10M * 20.0M, MidpointRounding.AwayFromZero) / 20.0M + (item.Price * item.Quantity);
    }

    public interface IItemVisitor
    {
        decimal Visit(Food item);
        decimal Visit(Book item);
        decimal Visit(Medicine item);
        decimal Visit(Other item);
    }

স্ট্যাকওভারফ্লোতে স্বাগতম। দয়া করে প্রশ্নের উত্তর হিসাবে আপনার উত্তরটি ব্যাখ্যা করেছেন তা নিশ্চিত করুন। ওপি কেবল একটি সমাধান চাইছে না তবে কেন সমাধান আরও ভাল / খারাপ।
সাইমন.এসএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.