Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
44m 57s
W swoim obszernym filmie "14 sposobów na uproszczenie kodu C#" Tim Corey omawia praktyczne najlepsze praktyki C#, które poprawiają czytelność kodu, redukują bałagan i utrzymują bazę kodu w stanie łatwym do zarządzania. Zamiast obsesyjnie skupiać się na jednowierszowcach lub enigmatycznych sztuczkach, Tim koncentruje się na dobrych praktykach kodowania—jak pisać czysty, zrozumiały kod, który inni deweloperzy mogą śledzić.
Kazdy wskazowka opiera na rzeczywistych przykładach w Visual Studio, omawiajac konwencje nazewnictwa, obsługę błędow, a nawet jak refaktoryzowac kod, nie powodujac jego uszkodzenia. To nie tylko teoria – chodzi o to, że praktyka sprawia, iż kod jest lepszy.
W tym artykułe przejdziemy przez kazdy z 14 sposobow, ktore zaprezentowal.
Tim rozpoczyna od pokazania, jak statyczny dostep może uproscic powtarzajace wywolania. Poprzez zadeklarowanie:
using static System.Console;Imports System.ConsoleNie musisz juz prefiksowac kazdego statycznego czlonka za pomoca Console.
To nie tylko usuwanie slow—chodzi o uczynienie dostepu statycznego bardziej przejrzystym. Tim zwraca uwagę, że jeśli wywołujesz członka statycznego zdefiniowanego w często używanej klasie, takiej jak Console lub Math, to skrócenie poprawia czytelność kodu.
Jednak jako element dobrych praktyk programistycznych, ostrzega on, że programiści powinni unikać konfliktów — dwie różne klasy mogą mieć tę samą nazwę dla statycznego członka. Swiadomosc potencjalnego niespodziewanego zachowania jest kluczowa.
Teraz w C# można bezpośredniej inicjalizować listy:
List<string> names = ["Tim", "Sue", "Bilbo"];Dim names As New List(Of String) From {"Tim", "Sue", "Bilbo"}Tim wyjaśnia, że nie chodzi o zmieszczenie wszystkiego w jednym stwierdzeniu, lecz o pisanie kodu, który jest łatwiejszy do czytania i optymalizacji wydajności poprzez redukcję ceremonii.
Zamiast analizować szablon "new List of String", czytelnik widzi dokładnie to, co jest istotne: opisowe nazwy w kolekcji. Tim zaznacza również, że działa to dla tablic, a nawet słowników, zgodnie z konwencjami kodowania, które priorytetem czynią przejrzystość.
Kolejne ułatwienie: target-typed new. Zamiast:
List<int> numbers = new List<int>();Dim numbers As New List(Of Integer)()możesz pisać:
List<int> numbers = new();Dim numbers As New List(Of Integer)()Tim podkreśla, że powtarzanie nazwy klasy jest niepotrzebne—już znajduje się po lewej stronie. Takie podejście zgodne jest z dobrymi praktykami programistycznymi poprzez usunięcie redundantności, co ułatwia przeglądanie kodu.
Tim zajmuje się var, funkcją, która wywołuje dyskusje w kręgach praktyk programistycznych. Niektorzy nie lubia tego, ze ukrywa nazwy zmiennych i typy, ale Tim wyjasnia, ze jego prawdziwa sila tkwi w typach anonimowych.
Podczas pracy ze źródłami danych (takimi jak SQL za pomocą Dapper), Tim pokazuje, jak var pozwala tworzyć obiekty dynamicznie:
var parameters = new { FirstName = "Tim", LastName = "Corey" };Dim parameters = New With {Key .FirstName = "Tim", Key .LastName = "Corey"}Jest to idealne do pisania zapytań lub jednorazowych obiektów—nie musisz tworzyć klasy bazowej tylko dla parametrów. Jak mówi Tim, to unika zanieczyszczania bazy kodu niepotrzebnymi typami, jednocześnie dostarczając znaczące komunikaty o błędach, jeśli coś pójdzie nie tak.
Tim przechodzi do przestrzeni nazw w zakresie pliku, pokazując, jak to:
namespace ProjectName
{
// indented code
}Namespace ProjectName
' indented code
End Namespacestaje się tym:
namespace ProjectName;Namespace ProjectName
End NamespaceTa drobna zmiana eliminuje niepotrzebne wcięcia i stosuje konwencje nazewnictwa w C# takie jak konwencja Pascal dla publicznych członków. Tim wyjaśnia, że ponieważ większość plików zawiera tylko jedno namespace, poprawia to czytelność kodu i utrzymuje logiczne sekcje w porządku.
Użycie rekordów pozwala zdefiniować obiekty danych w jednym tylko wyrażeniu:
public record EmployeeRecord(int Id, string Name);Public Class EmployeeRecord
Public Property Id As Integer
Public Property Name As String
Public Sub New(id As Integer, name As String)
Me.Id = id
Me.Name = name
End Sub
End ClassTim zauważa, że to generuje pełny typ—właściwości, niezmienność i ToString()—przy minimalnym wysiłku. Jest jasne, że scenariusze klas pochodnych nadal wymagają użycia klas, ale gdy obiekt jest tylko do odczytu, rekordy przestrzegają zasady pojedynczej odpowiedzialności, dobrze realizując jedno zadanie.
Tim demonstruje, jak dopasowywanie wzorców pomaga w obsłudze wyjątków i bezpiecznym wykonywaniu porównań. Zamiast pisać rozwlekłe sprawdzanie typów, można je połączyć:
if (emp is EmployeeRecord e)
{
e.Id = 1;
}If TypeOf emp Is EmployeeRecord Then
Dim e As EmployeeRecord = DirectCast(emp, EmployeeRecord)
e.Id = 1
End IfTa pojedyncza linia sprawdza i rzutuje. Tim mowi, ze jest to zgodne z dobrymi praktykami kodowania—unikasz jednosylabowych nazw zmiennych jak x lub y, a zamiast tego nadajesz opisowe nazwy jak e. Jasne nazwy metod i zmiennych sprawiają, że kod jest łatwiejszy do utrzymania dla innych deweloperów.
Aby tworzyć czytelne ciągi znaków, Tim demonstruje interpolację ciągów znaków:
$"The employee with ID {e.Id} is {e.Name}"$"The employee with ID {e.Id} is {e.Name}"Wskazuje, że to ułatwia tworzenie przejrzystych komunikatów o błędach i pisanie komentarzy. Zamiast skomplikowanego łączenia, można dosłownie napisać kod, który czyta się jak po angielsku—poprawiając jakość kodu i upraszczając przyszłe testy jednostkowe, które sprawdzają wynik.
Tim pokazuje, jak nameof() chroni cię podczas refaktoryzacji kodu. Nazwy zmiennych zakodowane na sztywno w ciągach znaków mogą prowadzić do nieoczekiwanego zachowania, jeśli zostaną zmienione. Ale pisząc:
nameof(emp)NameOf(emp)kompilator automatycznie aktualizuje każde użycie. Jest to jedna z najlepszych praktyk, która utrzymuje baze kodu w dobrym stanie, gdy piszesz czysty i zorganizowany kod.
Zamiast tworzyć klasę bazową tylko po to, aby zwrócić dwie wartości, Tim używa krotek:
(string FirstName, string LastName) SplitName(string fullName)Function SplitName(fullName As String) As (FirstName As String, LastName As String)Unika to niepotrzebnych zewnętrznych zależności i przestrzega zasady pojedynczej odpowiedzialności—metoda po prostu dzieli nazwę, nic więcej. Jak mówi Tim, praktyka czyni kod lepszym, kiedy unika się nadmiernego stosowania skomplikowanych rozwiązań.
Opierając się na krotkach, Tim pokazuje, jak zdekonstruować wyniki na lokalne zmienne:
var (firstName, lastName) = SplitName("Tim Corey");Dim firstName As String
Dim lastName As String
(firstName, lastName) = SplitName("Tim Corey")To utrzymuje opisowe nazwy zmiennych i unika nieczytelnej składni krotek później. Tim nawet odnosi się do odrzucania nieużywanych wartości (używając _), co sygnalizuje zamierzenie—żadne jednoliterowe nazwy zmiennych nie pozostają niewyjaśnione.
Jeśli nie potrzebujesz wszystkich części krotki, Tim zaleca przecinki:
var (firstName, _) = SplitName("Tim Corey");Dim firstName As String
(firstName, _) = SplitName("Tim Corey")To pokazuje innym programistom, że celowo ignorujesz wartość, co jest przydatne w ramach testowych lub testach jednostkowych, gdzie nie wszystkie wyniki są istotne.
Tim przechodzi do zarządzania zasobami i obsługi błędów. Wczesniej pisalbys:
using (var connection = new SqlConnection(connString))
{
// work
}Using connection As New SqlConnection(connString)
' work
End UsingTeraz możesz użyć:
using var connection = new SqlConnection(connString);Using connection As New SqlConnection(connString)To jest zgodne z zasadami SOLID—w szczególności z zasadą pojedynczej odpowiedzialności i zasadą odwrócenia zależności. Tim zauważa, że ta składnia działa dobrze dla zewnętrznych zależności, takich jak bazy danych, zapewniając, że obsługa wyjątków jest bardziej przejrzysta, a połączenia są zawsze zamykane, co zapobiega problemom z wydajnością lub nawet scenariuszom injekcji SQL, gdy połączenia nie są usuwane.
Na koniec, Tim omawia deklaracje zmiennych inline out w kontekście takich rzeczy jak parsowanie:
if (int.TryParse(numberText, out int numberValue))If Integer.TryParse(numberText, numberValue) ThenTutaj tworzysz zmienną lokalną w tej samej linii. Dzięki temu konwencje kodowania są ścisłe, a nazwy metod opisowe. Poprawne grupowanie kodu zmniejsza nieoczekiwane zachowania i sprawia, że przyszłe wysiłki związane z refaktoryzacją kodu są bezpieczniejsze.
Tim konczy swoje wideo przypominajac widzom: te uproszczenia nie sa o pisaniu zagadkowych jednoliniowcow—chodzi o dobre praktyki programistyczne. Funkcje takie jak użycie elementów statycznych, rekordów, dopasowywania wzorców, krotek i ignorowanie wartości pozwalają pisać czysty, nowoczesny kod w C#.
Zachęca programistów do zastanowienia się nad konwencjami nazewnictwa, obsługą błędów i używaniem znaczących nazw podczas przyjmowania tych funkcji. "Kod ma być czytelny dla ludzi," mówi Tim—i kiedy piszesz kod, który jest łatwy do zrozumienia, ułatwiasz życie sobie oraz innym programistom.
Krotko mowiac: zastosuj sie do najlepszych praktyk C#, przestrzegaj zasad SOLID, takich jak zasada pojedynczej odpowiedzialności, zasada segregacji interfejsow i zasada odwrocenia zależności, a twoj kod nie tylko sie skompiluje, ale także poprawi wydajność, zredukuje nieoczekiwane zachowanie i utrzyma zespol z zadowoleniem piszacym kod.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy