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?
Odpowiedz
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.
Dla tego, co Butterfly opisuje, metody rozszerzenia są zdecydowanie drogą do zrobienia. – Bomlin
Wow, metody rozszerzenia są zgrabne! Właśnie tego użyłem. Dziękuję za wzmiankę o nich. –
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.
+1 bicie mnie do tego. –
Prawdopodobnie skorzystasz również z metod rozszerzania funkcji. –
Zazwyczaj tworzę klasę Utilities i definiuję statyczne metody pomocnicze.
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)
{
// ...
}
}
Stworzyłem statyczną klasę robotów dla takich funkcji. Może nie najpiękniejszy sposób, ale ten, który utrzymuje rzeczy proste ...;)
K
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".
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.
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?
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();
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. –
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ń! –
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.
- 1. Gdzie umieścić funkcje pomocnicze w projekcie Feniksa?
- 2. Gdzie powinienem umieścić plik DLL (który używam w moim projekcie)?
- 3. Gdzie powinienem umieścić funkcje narzędzia testowego w Rust?
- 4. Gdzie powinienem umieścić wtyczkę .vim?
- 5. Gdzie powinienem umieścić Fabryki i Usługi AngularJS?
- 6. gdzie umieścić pliki .properties w projekcie Eclipse?
- 7. Gdzie umieścić statyczny javascript w projekcie Yesod?
- 8. Gdzie umieścić wspólne funkcje w pliku express.js?
- 9. Gdzie powinienem umieścić ogólnodostępną statyczną pustkę Główna?
- 10. Gdzie powinienem znaleźć współdzielone funkcje @helper w MVC Razor
- 11. Gdzie umieścić weblogic-application.xml w moim projekcie Maven 2?
- 12. Gdzie powinienem umieścić moje skrypty pythonowe w Linuksie?
- 13. Gdzie dokładnie powinienem umieścić wywołanie w [FBSettings publishInstall: appId]
- 14. Gdzie umieścić funkcje zdefiniowane przez użytkownika w Angular JS?
- 15. Gdzie umieścić impliciteWait w kątomierzu?
- 16. Gdzie umieścić autora w cytacie?
- 17. Pryzmat WPF - gdzie umieścić zasoby?
- 18. Gdzie powinienem umieścić publiczną metodę statyczną void main (String [] args)?
- 19. Symfony2 - Gdzie powinienem umieścić pliki przesłane przez użytkowników?
- 20. Gdzie powinienem umieścić mój plik dziennika dla aplikacji asp.net?
- 21. Gdzie powinienem umieścić moje asp.net-mvc z mocno wpisanymi widokami?
- 22. WPF MahApps.Metro - Gdzie umieścić ResourceDictionaries?
- 23. Gdzie umieścić skrypty PowerShell?
- 24. css3pie w MVC, gdzie umieścić plik pie.htc?
- 25. Czy powinienem umieścić logikę walidacji w POCO?
- 26. Gdzie umieścić test jednostkowy projektu
- 27. Niestandardowa kontrola w projekcie aplikacji sieci .net
- 28. Gdzie umieścić funkcję XSL w dokumencie XSL?
- 29. Gdzie można przechowywać funkcje pomocnicze?
- 30. Gdzie umieścić "&" w parametrze funkcji?
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
To byłby WinForms. –