2013-08-18 73 views
0

我是OOP編程的新手,我想知道是否有人可以幫助我我一直在編寫一些代碼,並且我意識到有很多重複的東西需要該程序來完成;如何停止重複代碼

class scrape 
{ 
    public void parse() 
    { 
     string Url = "http://www.blah.co.uk/"; 
     HtmlWeb web = new HtmlWeb(); 
     HtmlDocument doc = web.Load(Url); 
     Console.WriteLine("URL Loaded,"); 

     scrape scrape = new scrape(); 
     scrape.cats(doc); 
    } 
    private void cats(HtmlDocument doc) 
    { 
     HtmlNode topcats = doc.GetElementbyId("main_nav"); 
     if (topcats != null) 
     { 
      IEnumerable<HtmlNode> topnav = topcats.Descendants("a"); 
      foreach (var toplink in topnav) 
      { 
       if (toplink.Attributes.Contains("href")) 
       { 
        if (toplink.Attributes["href"].Value.EndsWith(".html")) 
        { 
         Console.WriteLine("http://www.blah.co.uk/" + toplink.Attributes["href"].Value); 
         Console.WriteLine("++++++++ " + toplink.InnerText + " +++++++++++"); 


         //sub cats 
         HtmlWeb cat_web = new HtmlWeb(); 
         HtmlDocument cat_doc = cat_web.Load("http://www.blah.co.uk/" + toplink.Attributes["href"].Value); 

         HtmlNode subcats = cat_doc.GetElementbyId("pagenav"); 
         if (subcats != null) 
         { 
          IEnumerable<HtmlNode> subnav = subcats.Descendants("a"); 
          foreach (var sublink in subnav) 
          { 
           if (sublink.Attributes.Contains("href")) 
           { 
            if (sublink.Attributes["href"].Value.EndsWith(".html")) 
            { 
             Console.WriteLine("http://www.blah.co.uk/" +sublink.Attributes["href"].Value); 
             Console.WriteLine(sublink.InnerText); 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
     Console.ReadLine(); 
    } 
} 

}

從上面可以有一個人請幫我減少代碼重複,我怎麼能去在C#這樣做。任何幫助或信息將不勝感激謝謝。

+2

您可以使用XPath而不是手動遍歷DOM。 – Dai

+1

我會通過反轉if語句來減少縮進,所以它更容易閱讀。即'if(topcats == null)return;'或'if(!toplink.Attributes.Contains(「href」))continue;' –

+1

您應該在[Code Review Stack Exchange]上發佈這個代碼(http:// codereview .stackexchange.com /)網站 –

回答

1

我認爲你的任務真的是關於面向對象的介紹。
設計OOP應用程序時,您需要考慮自己在做什麼,
什麼是參與的「事物」,將它們分爲類和對象(類的實例)。
認爲一個對象可以做什麼並且寫出最基本的動作,然後根據基本動作做出更復雜的動作。
https://www.youtube.com/watch?v=c5kfCH50wl0

例如實例和創建的,Parse方法是對象的一部分,並且它對於任何理由,可以看出創建一個新的實例。

我已經爲你制定了方法。

public void Read() 
{ 
    HtmlDocument topDocument = LoadDocument("blah.uk"); 
    IEnumerable<HtmlNode> topLinks = ReadLinks(topDocument, "main_nav"); 
    foreach (HtmlNode topLink in topLinks) { 
     HtmlDocument catDoc = LoadDocument("littletreasurespartybags" + toplink.Attributes["href"].Value); 
     IEnumerable<HtmlNode> catLinks = ReadLinks(topDocument, "main_nav"); 
     foreach (HtmlNode catLink in catLinks) { 
      ..... 
     } 
    } 
} 

private HtmlDocument LoadDocument(string Url) { ..... } 
private IEnumerable<HtmlNode> ReadLinks(HtmlDocument document, string topElement) { ....}