2013-08-18 3 views
0

Я новичок в программировании ООП, и мне было интересно, может ли кто-нибудь помочь мне. Я писал код, и я понял, что есть много дубликатов, что мне нужно для этой программы;Как прекратить делать повторяющийся код

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 /) website –

ответ

1

Я думаю, что ваш квест - это действительно введение в ООП.
При разработке приложения ООП вам нужно подумать, что вы делаете,
Что такое «вещи», которые участвуют, делят их на классы и объекты (экземпляры класса).
думаю, что может сделать объект и написать самые основные действия, а затем сделать более сложные действия на основе базовых.
https://www.youtube.com/watch?v=c5kfCH50wl0

Для примера инстансов и создания, метод Анализировать является частью объекта, и он создает новый экземпляр без причины, что можно увидеть.

Я разработал методы для вас.

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) { ....} 
Смежные вопросы