2017-06-12 21 views
0

数日間、私はこの特定のレッスンについて、マイクロソフトのサイトにある.NETチュートリアルで研究し、勉強してきました。 LINKカプセル化とインターフェイス

すでにご存知のように、各レッスンの最後には「宿題」があります。 今回は、いくつかの新機能を使用して特定のプロジェクトをアップグレードし、カプセル化とインターフェイスを実装する必要があります。

の新機能が含まれている必要があります

  • お客様が

    //更新彼らの歴史的な受注を暴露する性質を持っている:

  • お客様が注文を追加するためのメソッドを公開実装

  • 私が成功した唯一のものは削除して//

    (重複を追加していない)何に

  • を行うべきではない既存の注文番号と注文を追加しようとすると、既存の順序を交換する必要があり、ヌル注文を追加しようとし前の「注文」は同じ名前で交換するだけではありません。

  • 何に

私が管理しなかった

を行うべきではない、将来の受注日と秩序を追加しようとする(読み取り/書き込み可能)受注日

  • を公開する必要があります

    受注これらの機能のほとんどを追加します。現在、私のプロジェクト(更新):私は検索し、私はまだ私はここでそれらを実装する必要がありますかわからないカプセル化とのインタフェースのためのさまざまな動画を見たとしてもカントー

    namespace ConsoleApp2 
    { 
    class Program 
    { 
        static void Main() 
        { 
         Customer customer1 = new Customer("John"); 
         Customer customer2 = new Customer("George"); 
         var customers = new List<Customer>() { customer1, customer2 }; 
         customer1.AddOrder("car", "12/7/1999"); // will be removed due to same name 
         customer1.AddOrder("vase", "20/6/2024");// will not be added to the list because of the future time 
         customer1.AddOrder("car", "3/12/2014"); 
         customer1.AddOrder("headphones", "3/12/2022");// will not be added to the list because of the future time 
         customer2.AddOrder("headphones", "10/3/2002"); 
         customer2.AddOrder("", "");// will not be added to the list due to empty values 
    
         //print customers 
    
         foreach (var customer in customers) 
         { 
          customer.Print(); 
         } 
        } 
    } 
    public class Customer 
    { 
        public string Name { get; } 
        private List<Order> orders = new List<Order>(); 
        private List<Order> ordersHistory = new List<Order>(); 
    
    
        public Customer(string name) 
        { 
         Name = name; 
        } 
    
        public void AddOrder(string name, string date) 
        { 
         if (name == null) { return; } 
         else if (name == "" || date == "") { return; } 
         else 
         { 
          AddHistoricOrder(name, date); 
          AddRegularOrder(name, date); 
         } 
    
    
        } 
        public void Print() 
        { 
         Console.WriteLine(Name); 
         Console.Write("Orders: "); 
         orders.ForEach(Console.Write); 
         Console.WriteLine(); 
         Console.Write("Historic Orders: "); 
         ordersHistory.ForEach(Console.Write); 
         Console.WriteLine(); 
         Console.WriteLine($"Order Count: {orders.Count}"); 
         Console.WriteLine(); 
         Console.WriteLine(); 
        } 
    
        private void AddRegularOrder(string name, string date) 
        { 
    
         if (DateTime.Parse(date) > DateTime.Now) { return; } 
         else 
         { 
    
          for (int i = 0; i < orders.Count; i++) 
          { 
           if (orders[i].OrderName == name) 
           { 
            orders.RemoveAt(i); 
           } 
          } 
          orders.Add(new Order(name, date)); 
    
         } 
        } 
        private void AddHistoricOrder(string name, string date) 
        { 
         ordersHistory.Add(new Order(name, date)); 
        } 
        public override string ToString() 
        { 
         return $"{Name}"; 
        } 
    
    } 
    public class Order 
    { 
        public string OrderName { get; } 
        public DateTime OrderDate { get; set; } 
    
        public Order(string orderName, string date) 
        { 
         OrderName = orderName; 
         OrderDate = DateTime.Parse(date);; 
        } 
        public override string ToString() 
        { 
         return $"{OrderName} ({OrderDate.ToShortDateString()}), "; 
        } 
    } 
    } 
    

    。 コードをより効率的にするのに役立つでしょうか?

    私は(私はちょうどそれを行うことになっているかわからないんだけど)歴史的な受注を露出させるためのプロパティを実装していませんでした

    また、私は本当に「新である接着剤」と呼ばれる授業の一部を理解しませんでした新しいキーワードをコードに追加するのを避け、インターフェースを使っていくつかの例を示しました。指定外の情報が見つかりませんLINK この特定のプロジェクトで新しいインスタンスを作成しないようにするにはどうすればよいですか? ありがとうございます!

  • +2

    はもの "新のりである" ことを無視します。それが反パターンでないときは、通常は過度のものです。必ずしもそうではありませんが、あなたはまだそれについて心配する必要はありません。 –

    +0

    私はEdに同意します。インターフェイスと悩みの分離をマスターするまでは、IoCや工場のパターン(「新しいものは何か」という記事がすべてです)を把握するのは難しいでしょう。 IoCを実装する前に、よく設計されたクラスとインターフェイスから多くの価値を得ることができます。これらも、前提条件です。複数のクラスが同じインターフェースを使用する特定のユースケースがあるまで、ファクトリパターンの適切な使用を評価することは難しいです。 – AaronLS

    答えて

    1
    1. 顧客は、歴史的な受注を暴露する性質を持っています。

      公開リスト{get;} =新しいリスト();

    2. 何もやるべきではないヌル注文を追加しようとすると:

      が、私はここに必要な機能がnullのオブジェクト

      代わりにしてみてくださいあなたは名前と日付を使用して注文を追加する
      public void AddOrder(Order o){ 
          if (o == null){ 
          return; 
          } 
      
          //rest of your implememntaton 
      } 
      

      を無視することだと思うが Orderオブジェクトを関数に渡します。簡略化のため、名前は という一意の識別子であると仮定します。

    3. 新グルー

      脇依存性注入(今とにかくあなたのためにそのわずか話題の言葉)です。

      彼らは何を強調しようとしていることは、「新しい」キーワードは、作成特定のクラスへの依存 を作成することですので、あなたは 変更などオーダー/顧客の世話をするクラスに、将来的に決める必要があります をコードに戻して、おそらく複数の場所で修正する必要があります。

      機能の中に「新規」を使用していても、限定されたツールで代行できるのは、 にオブジェクトを作成する機能を追加することです。例えば

      public Order CreateNewOrder(string name, string date) { return new Order (name, date); }

    +0

    返信ありがとう!私はあなたの解決策を試してみよう! – Nyx

    0

    何かを終わらせる完璧な方法はありません。いつもより良い方法があるので、特に始動するときに、完璧なコードを心配する必要はありません。

    私はチュートリアルを読んでいますが、私はあなたのコードをチェックしました。これまでのところ素晴らしいことだと思います。

    歴史的な注文を公開するためのプロパティについてこれはあまりにも一般的であるため、これはさまざまな解釈が可能だと思います。たとえば、私は、日付、名前、またはそれが空であるかどうかを気にせずに、顧客が要求するすべての注文を追加する別のリストを作成することができます。

    もう1つの方法は、別のリストを追加することです。ただし、同じ名前のオーダーを追加すると、以前のものを削除せずに保存することができます。

    あなたはこのようなことをすることができます。 ちょうど順序リストを公開するためにゲッターを追加します。

    public class Customer 
    { 
        public string Name { get; } 
        private List<Order> orders = new List<Order>(); 
        public List<Order> historicOrders = new List<Order>(); 
    
    
        public Customer(string name) 
        { 
         Name = name; 
        } 
    
        public void AddOrder(string name, string date) 
        { 
         if (name == "" || date == "") ; 
         else if (DateTime.Parse(date) > DateTime.Now) ; 
         else 
         { 
    
          for (int i = 0; i < orders.Count; i++) 
          { 
           if (orders[i].OrderName == name) 
           { 
            orders.RemoveAt(i); 
           } 
          } 
          orders.Add(new Order(name, date)); 
          historicOrders.Add(new Order(name, date)); 
    
         } 
        } 
    
        public void Print() 
        { 
         Console.WriteLine(Name); 
         Console.Write("Orders: "); 
         orders.ForEach(Console.Write); 
         Console.WriteLine(); 
         Console.WriteLine($"Order Count: {orders.Count}"); 
         Console.WriteLine(); 
         Console.WriteLine(); 
        } 
        public override string ToString() 
        { 
         return $"{Name}"; 
        } 
    
    } 
    
    +0

    返事をありがとう、私はあなたが示唆したように別のリストを使用してこの "歴史的な注文"のものを作成しようとします。 – Nyx