window.pipedriveLeadboosterConfig = { base: 'leadbooster-chat.pipedrive.com', companyId: 11580370, playbookUuid: '22236db1-6d50-40c4-b48f-8b11262155be', version: 2, } ;(function () { var w = window if (w.LeadBooster) { console.warn('LeadBooster już istnieje') } else { w.LeadBooster = { q: [], on: function (n, h) { this.q.push({ t: 'o', n: n, h: h }) }, trigger: function (n) { this.q.push({ t: 't', n: n }) }, } } })() Jak napisać dobry i jakościowy kod? - The Codest
The Codest
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Branże
    • Fintech i bankowość
    • E-commerce
    • Adtech
    • Healthtech
    • Produkcja
    • Logistyka
    • Motoryzacja
    • IOT
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
  • O nas
  • Nasze Usługi
    • Software Development
      • Frontend Development
      • Backend Development
    • Zespoły IT
      • Programiści frontendowi
      • Backend Dev
      • Inżynierowie danych
      • Inżynierowie rozwiązań chmurowych
      • Inżynierowie QA
      • Inne
    • Konsultacje IT
      • Audyt i doradztwo
  • Wartość dla
    • CEO
    • CTO
    • Delivery Managera
  • Nasz zespół
  • Case Studies
  • Nasze Know How
    • Blog
    • Meetups
    • Webinary
    • Raporty
Kariera Skontaktuj się z nami
Strzałka w tył WSTECZ
2020-11-13
Software Development

Jak napisać dobry i jakościowy kod?

Justyna Mianowska

Pisanie ładnego, dobrze zaprojektowanego i dobrze wyglądającego kodu nie jest tak trudne, jak się wydaje. Wymaga trochę wysiłku, aby poznać główne zasady i po prostu używać ich w swoim kodzie. I nie musi to być wszystko na raz, ale jak poczujesz się komfortowo z jedną rzeczą, spróbuj pomyśleć o innej, i tak dalej.

Twórz solidny, a nie głupi kod

Zacznijmy od wprowadzenia najbardziej elementarnych zasad, które nazywane są SOLID. Jest to termin opisujący zbiór zasad projektowania dla dobrego kod który został wymyślony przez Roberta C. Martina i jak to działa:

S oznacza zasadę pojedynczej odpowiedzialności

Stwierdza ona, że klasa powinna mieć jeden i tylko jeden powód do zmiany. Innymi słowy, klasa powinna mieć tylko jedno zadanie do wykonania, więc powinniśmy unikać pisania dużych klas z wieloma obowiązkami. Jeśli nasza klasa ma robić wiele rzeczy, to każda z nich powinna zostać oddelegowana do osobnej.

klasa Powiadomienie
  def initialize(params)
    @params = params
  end

  def call
    EmailSender.new(message).call
  end

  private

  def wiadomość
    # jakaś implementacja
  koniec
end

O oznacza zasadę otwartą/zamkniętą

Stwierdza ona, że powinieneś być w stanie rozszerzyć zachowanie klasy bez modyfikowania jej. Innymi słowy, powinno być łatwo rozszerzyć klasę bez wprowadzania do niej jakichkolwiek modyfikacji. Możemy to osiągnąć np. za pomocą wzorca strategii lub dekoratorów.

klasa Powiadomienie
  def initialize(params, sender)
    @params = params
    @sender = nadawca
  end

  def call
    sender.call message
  end

  prywatny

  def message
    # jakaś implementacja
  koniec
end

class EmailSender
  def call(message)
    # pewna implementacja
  end
koniec

class SmsSender
  def call(message)
    # pewna implementacja
  end
end

Dzięki takiemu rozwiązaniu możliwe jest dodawanie nowych nadawców bez konieczności zmiany kodu.

L oznacza zasadę substytucji Liskowa

Stwierdza ona, że klasy pochodne muszą być zastępowalne dla swoich klas bazowych. Innymi słowy, użycie klas pochodzących od tego samego przodka powinno być łatwe do zastąpienia przez innego potomka.

class Logger {
  info (message) {
    console.info(this._prefixFor('info') + message)
  }

  error (message, err) {
    console.error(this._prefixFor('error') + message)
    if (err) {
      console.error(err)
    }
  }

  _prefixFor (type) {
    // jakaś implementacja
  }
}

class ScepticLogger extends Logger {
  info(message) {
    super.info(message)
    console.info(this._prefixFor('info') + 'I to wszystko, co miałem do powiedzenia.')
  }

  error (message, err) {
    super.error(message, err)
    console.error(this._prefixFor('error') + 'Wielka sprawa!')
  }
}

Możemy łatwo zastąpić nazwę klasy, ponieważ obie mają dokładnie ten sam interfejs użytkowania.

Mam na myśli zasadę segregacji interfejsów

Stwierdza, że należy tworzyć drobnoziarniste interfejsy, które są specyficzne dla klienta. Czym jest interfejs? Jest to dostarczony sposób użycia pewnej części kodu. Tak więc naruszeniem tej zasady może być np. klasa ze zbyt wieloma metodami, a także metoda ze zbyt wieloma opcjami argumentów. Dobrym przykładem na zobrazowanie tej zasady jest wzorzec repozytorium, nie tylko dlatego, że często umieszczamy wiele metod w jednej klasie, ale także dlatego, że metody te są narażone na ryzyko przyjęcia zbyt wielu argumentów.

# nie jest tym razem najlepszym przykładem
class NotificationRepository
  def find_all_by_ids(ids:, info:)
    notifications = Notification.where(id: ids)
    info ? notifications.where(type: :info) : notifications
  end
end

# i jeszcze lepszy
class NotificationRepository
  def find_all_by_ids(ids:)
    Notification.where(id: ids)
  end

  def find_all_by_ids_info(ids:)
    find_all_by_ids(ids).where(type: :info)
  end
end

D oznacza zasadę inwersji zależności

Stwierdza, że powinieneś polegać na abstrakcjach, a nie na konkretyzacjach. Innymi słowy, klasa, która korzysta z innej, nie powinna zależeć od szczegółów jej implementacji, ważny jest tylko interfejs użytkownika.

klasa Powiadomienie
  def initialize(params, sender)
    @params = params
    @sender = nadawca
  end

  def call
    sender.call message
  end

  prywatny

  def message
    # jakaś implementacja
  koniec
end

Wszystko co musimy wiedzieć o obiekcie nadawcy to to, że udostępnia on metodę `call`, która oczekuje wiadomości jako argumentu.

Nie jest to najlepszy kod w historii

Bardzo ważne jest również poznanie rzeczy, których należy bezwzględnie unikać podczas pisania kodu, więc oto kolejny zbiór STUPID zasad, które sprawiają, że kod nie jest łatwy w utrzymaniu, trudny do testowania i ponownego użycia.

S oznacza Singleton

Singletony są często uważane za anty-wzorce i generalnie powinno się ich unikać. Głównym problemem tego wzorca jest jednak to, że jest on swego rodzaju wymówką dla zmiennych/metod globalnych i może być szybko nadużywany przez programistów.

T oznacza szczelne złącze

Jest on zachowywany, gdy zmiana w jednym module wymaga również zmian w innych częściach aplikacji.

U oznacza Niesprawdzalność

Jeśli kod jest dobry, pisanie testów powinno być zabawą, a nie koszmarem.

P oznacza przedwczesną optymalizację

Słowo "przedwczesne" jest tutaj kluczowe, jeśli nie potrzebujesz tego teraz, to jest to strata czasu. Lepiej jest skupić się na dobrym, czystym kodzie niż na mikro-optymalizacjach - które generalnie powodują bardziej złożony kod.

Mam na myśli nieopisowe nazewnictwo

Jest to najtrudniejsza rzecz w pisaniu dobrego kodu, ale pamiętaj, że jest to nie tylko dla reszty twojego kodu. zespół ale także dla Ciebie w przyszłości, więc traktuj Cię dobrze 🙂 Lepiej jest napisać długą nazwę metody, która mówi wszystko, niż krótką i enigmatyczną.

D oznacza duplikację

Głównym powodem powielania kodu jest przestrzeganie zasady ścisłego sprzężenia. Jeśli twój kod jest ściśle powiązany, po prostu nie możesz go ponownie użyć i pojawia się zduplikowany kod, więc postępuj zgodnie z DRY i nie powtarzaj się.

W tej chwili nie ma to większego znaczenia

Chciałbym również wspomnieć o dwóch bardzo ważnych rzeczach, które często są pomijane. Pierwsza z nich to YAGNI, czyli: nie będziesz tego potrzebował. Od czasu do czasu obserwuję ten problem podczas przeglądania kodu lub nawet pisania własnego kodu, ale powinniśmy zmienić nasze myślenie o implementacji funkcji. Powinniśmy pisać dokładnie taki kod, jaki jest nam potrzebny w danym momencie, ani mniej, ani więcej. Powinniśmy pamiętać, że wszystko zmienia się bardzo szybko (zwłaszcza wymagania aplikacji), więc nie ma sensu myśleć, że coś kiedyś się przyda. Nie marnujmy czasu.

Nie rozumiem

I ostatnia rzecz, chyba nie do końca oczywista, a dla niektórych może być dość kontrowersyjna, to kod opisowy. Nie mam tu na myśli tylko używania odpowiednich nazw dla klas, zmiennych czy metod. Naprawdę dobrze jest, gdy cały kod jest czytelny od pierwszego wejrzenia. Jaki jest cel bardzo krótkiego kodu, który jest tak enigmatyczny, jak to tylko możliwe i nikt nie wie, co robi, z wyjątkiem osoby, która go napisała? Moim zdaniem lepiej jest napisać kilka znakówdeklaracje warunkówcoś więcej niż jedno słowo, a potem wczoraj siedzenie i zastanawianie się: czekaj, jaki jest wynik, jak to się stało i tak dalej.

const params = [
  {
    movies: [
      { title: 'Skazani na Shawshank' }
      { title: 'Lot nad kukułczym gniazdem' }
    ]
  },
  {
    filmy: [
      { title: 'Szeregowiec Ryan' }
      { title: 'Pulp Fiction' }
      { tytuł: "Skazani na Shawshank" },
    ]
  }
]

// pierwsza propozycja
function uniqueMovieTitlesFrom (params) {
  const titles = params
    .map(param => param.movies)
    .reduce((prev, nex) => prev.concat(next))
    .map(movie => movie.title)

  return [...new Set(titles)]
}

// druga propozycja
function uniqueMovieTitlesFrom (params) {
  const titles = {}
  params.forEach(param => {
    param.movies.forEach(movie => titles[movie.title] = true)
  })

  return Object.keys(titles)
}

Podsumowując

Jak widać, istnieje wiele zasad do zapamiętania, ale jak wspomniałem na początku, pisanie ładnego kodu jest kwestią czasu. Jeśli zaczniesz myśleć o jednym ulepszeniu swoich nawyków kodowania, zobaczysz, że pojawią się kolejne dobre zasady, ponieważ wszystkie dobre rzeczy powstają same z siebie, tak jak te złe.

Czytaj więcej:

Czym jest Ruby on Jets i jak zbudować aplikację przy jego użyciu?

Vuelendar. Nowy projekt Codest oparty na Vue.js

Cotygodniowy raport Codest z najlepszymi artykułami technicznymi. Tworzenie oprogramowania dla 50 milionów współbieżnych gniazd (10)

Powiązane artykuły

Software Development

Tworzenie przyszłościowych aplikacji internetowych: spostrzeżenia zespołu ekspertów The Codest

Odkryj, w jaki sposób The Codest wyróżnia się w tworzeniu skalowalnych, interaktywnych aplikacji internetowych przy użyciu najnowocześniejszych technologii, zapewniając płynne doświadczenia użytkowników na wszystkich platformach. Dowiedz się, w jaki sposób nasza wiedza napędza transformację cyfrową i biznes...

THEECODEST
Software Development

10 najlepszych firm tworzących oprogramowanie na Łotwie

Dowiedz się więcej o najlepszych łotewskich firmach programistycznych i ich innowacyjnych rozwiązaniach w naszym najnowszym artykule. Odkryj, w jaki sposób ci liderzy technologiczni mogą pomóc w rozwoju Twojej firmy.

thecodest
Rozwiązania dla przedsiębiorstw i scaleupów

Podstawy tworzenia oprogramowania Java: Przewodnik po skutecznym outsourcingu

Zapoznaj się z tym niezbędnym przewodnikiem na temat skutecznego tworzenia oprogramowania Java outsourcing, aby zwiększyć wydajność, uzyskać dostęp do wiedzy specjalistycznej i osiągnąć sukces projektu z The Codest.

thecodest
Software Development

Kompletny przewodnik po outsourcingu w Polsce

Wzrost liczby outsourcing w Polsce jest napędzany przez postęp gospodarczy, edukacyjny i technologiczny, sprzyjający rozwojowi IT i przyjazny klimat dla biznesu.

TheCodest
Rozwiązania dla przedsiębiorstw i scaleupów

Kompletny przewodnik po narzędziach i technikach audytu IT

Audyty IT zapewniają bezpieczne, wydajne i zgodne z przepisami systemy. Dowiedz się więcej o ich znaczeniu, czytając cały artykuł.

The Codest
Jakub Jakubowicz CTO & Współzałożyciel

Subskrybuj naszą bazę wiedzy i bądź na bieżąco!

    O nas

    The Codest - Międzynarodowa firma programistyczna z centrami technologicznymi w Polsce.

    Wielka Brytania - siedziba główna

    • Office 303B, 182-184 High Street North E6 2JA
      Londyn, Anglia

    Polska - lokalne centra technologiczne

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polska

      The Codest

    • Strona główna
    • O nas
    • Nasze Usługi
    • Case Studies
    • Nasze Know How
    • Kariera
    • Słownik

      Nasze Usługi

    • Konsultacje IT
    • Software Development
    • Backend Development
    • Frontend Development
    • Zespoły IT
    • Backend Dev
    • Inżynierowie rozwiązań chmurowych
    • Inżynierowie danych
    • Inne
    • Inżynierowie QA

      Raporty

    • Fakty i mity na temat współpracy z zewnętrznym partnerem programistycznym
    • Z USA do Europy: Dlaczego amerykańskie startupy decydują się na relokację do Europy?
    • Porównanie centrów rozwoju Tech Offshore: Tech Offshore Europa (Polska), ASEAN (Filipiny), Eurazja (Turcja)
    • Jakie są największe wyzwania CTO i CIO?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Warunki korzystania z witryny

    Copyright © 2025 by The Codest. Wszelkie prawa zastrzeżone.

    pl_PLPolish
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek pl_PLPolish