2017-06-12 84 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

我同意愛德。在你掌握了接口和關注點分離之前,很難掌握IoC或工廠模式(這是「新膠」的文章是什麼)。你從設計良好的類和接口中獲得更多價值,而且在實現IoC之前,這些也是一個先決條件。在您有多個類使用相同接口的特定用例之前,您很難評估正確使用工廠模式。 – AaronLS

回答

1
  1. 客戶有一個屬性暴露自己的歷史訂單: 只需添加一個getter,露出順序列表。

    公開名單的訂單{獲得;} =新名單();

  2. 嘗試添加空令應該什麼都不做:

    我覺得這裏所需要的功能是忽略空物體

    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

沒有完成任務的完美方式,總是有一個更好的方法來完成它,所以不用擔心完美的代碼,特別是當你開始使用時。

我已經閱讀了教程,並且檢查了您的代碼,我認爲您目前的表現非常出色。

關於財產暴露歷史常規,我相信這可以用不同的方式解釋,因爲太一般了。例如,我可以創建另一個列表,添加每個客戶請求的訂單,而不用擔心日期,名稱或空白。

另一種方法是添加另一個列表爲主體的一個與你有相同的名稱添加一個訂單,將其存儲無需刪除先前的一個,因爲它是一個歷史的例外。

你可以做這樣的事情。

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