2009-09-24 11 views
6

Podczas pracy nad parserem tekstu w języku C# musiałem usunąć pierwszą linię ciągu. Stworzyłem prostą funkcję, aby to zrobić dla mnie, ale pochodząc z tła PHP, nie mam pojęcia, gdzie go umieścić, ponieważ nie mogę zdefiniować funkcji poza klasą. Jaki jest zwyczajowy sposób robienia tego w .NET? Czy utworzyć klasę statyczną do przechowywania mojej funkcji?Gdzie powinienem umieścić różne funkcje w projekcie .NET?

+1

Jaki rodzaj projektu .NET? ASP.NET? ASP.NET MVC? WinForms? Silverlight? Konwencje dotyczące "gdzie umieścić" różnią się w zależności od rodzaju projektu. – Portman

+0

To byłby WinForms. –

Odpowiedz

18

Tak, statyczne klasy pomocnicze są zwykle sposób, aby to zrobić.

Również w C# 3 można zadeklarować metodę tak:

public static string RemoveFirstLine(this string s) { 
    ... 
} 

aby metodę rozszerzenia. Następnie możesz wywołać go na dowolnym łańcuchu tak, jakby metoda została zadeklarowana w samym typie łańcucha.

+0

Dla tego, co Butterfly opisuje, metody rozszerzenia są zdecydowanie drogą do zrobienia. – Bomlin

+0

Wow, metody rozszerzenia są zgrabne! Właśnie tego użyłem. Dziękuję za wzmiankę o nich. –

20

Generalnie robię helper lub Utility static class, a następnie umieszczam tam odpowiednie funkcje pomocnicze.

Dodatkowo staram się, aby klasy Pomocnika i Użyteczności były pogrupowane logicznie - umieszczanie funkcji analizy tekstu obok funkcji konwersji obiektów jest bezsensowne. Zamieszanie jest usuwane za pomocą klasy TextUtils i klasy ConversionUtils.

+0

+1 bicie mnie do tego. –

+6

Prawdopodobnie skorzystasz również z metod rozszerzania funkcji. –

2

Zazwyczaj tworzę klasę Utilities i definiuję statyczne metody pomocnicze.

4

Nie sądzę, że istnieje jakiś standard. Mam tendencję do tworzenia statycznej klasy o nazwie BlahUtil. Dla twojego przykładu uczyniłbym to statyczną metodą na StringUtil. Pomaga to grupować powiązane metody w rozsądne jednostki, ułatwiając ich odkrywanie i dzielenie się nimi w zespołach.

Można również wtedy wybrać, które z tych metod są eksponowane jako metod rozszerzenie (od C# 3.0):

public static class StringUtil 
{ 
    public static string RemoveFirstLine(this string multiLineString) 
    { 
     // ... 
    } 
} 
0

Stworzyłem statyczną klasę robotów dla takich funkcji. Może nie najpiękniejszy sposób, ale ten, który utrzymuje rzeczy proste ...;)

K

0

Użyć extension method na sznurku. Po to są.

+0

Cholera dodana podczas pisania mojej odpowiedzi !! –

1

Zrobiłem statyczne klasy "pomocnika", ale po pewnym analizie; ten typ funkcji pomocniczej zawsze kończy się jako odrębna implementacja klasy. W twoim przypadku masz klasę "podstawowy parser tekstowy" i klasę pochodną, ​​która zastępuje metodę "parsowania".

0

Możesz używać klasy metodami statycznymi. Coś takiego jak ParserUtils.RemoveFirstLine(). W .NET 3.5 i nowszych wersjach można czasem używać metod rozszerzeń, gdy funkcje narzędzia są powiązane z klasą, której nie można zmodyfikować, np. Klasa String. Intellisense wyświetli metodę rozszerzenia dla dowolnego obiektu typu string w projekcie.

6

Uważaj!

  • Ogólne funkcje narzędziowe, które są przekrojowe, powinny znajdować się w wyższej przestrzeni nazw użytkowych. Parsowanie łańcuchów, manipulowanie plikami itp.

  • Przedłużone obiekty powinny znajdować się we własnej przestrzeni nazw.

  • Funkcje narzędziowe, które mają zastosowanie do określonego zestawu obiektów biznesowych lub metod, powinny znajdować się w przestrzeni nazw tych obiektów. Często z sufiksem pomocnika, np. BusinessObjectHelper. Nazewnictwo jest tutaj ważne. Czy tworzysz kontener dla różnych metod, czy bardziej sensownym byłoby grupowanie ich w wyspecjalizowane obiekty, np. Parser?

3

Jeśli używasz C# 3.0, możesz rozważyć użycie metody rozszerzenia!

public static class StringExtensions 
{ 
    public static string RemoveFirstLine(this string myString) 
    { 
     return myString.Remove("line..!"); 
    } 
} 

Następnie w kodzie można to zrobić:

string myString = "Hello World etc"; 

string removedLineString = myString.RemoveFirstLine(); 
+1

Generalnie nienawidzę metod rozszerzenia. Łamią klasy i bibliotekę enkapsulacji funkcjonalności. Kim jestem, aby "naprawić" bibliotekę .net? Teraz ktoś używa jakiejś metody w moim kodzie myString.Whargarble(). Gdzie znajdują tę metodę? Myślę, że myString = MyCompany.StringUtils.Whargarble (myString) jest bardziej przejrzystym stwierdzeniem, co się dzieje. –

+0

To trafny punkt, od ciebie zależy jak zaimplementować swój kod :). Nie jestem pewien, czy rozszerzenie jest uważane za poprawkę, jest to raczej rozszerzenie! Znajdują go klikając na niego i wybierając F12, i określają jego metodę rozszerzenia za pomocą małej ikony w intellisense. Jest mało prawdopodobne, że natkną się na niego, jeśli dodasz je do przestrzeni nazw rozszerzeń; następnie explicity "opt-in" do korzystania z niego. Nie mam z tym żadnych problemów osobiście. Jak by to "złamało hermetyzację funkcjonalności" !? Jest zamknięty w klasie rozszerzeń! –

0

Rozszerzenia są do zrobienia w tych sprawy. Dosłownie dodaje twoją funkcję do występu. Jedyną rzeczą jest to, że nie można wykonać statycznej metody w roku 2008.

Powiązane problemy