Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Czym jest eksplozja kombinatoryczna?

Okładka posta: Czym jest eksplozja kombinatoryczna?
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Eksplozja kombinatoryczna to zjawisko, gdy liczba możliwych wariantów gwałtownie rośnie wraz ze wzrostem liczby elementów. Wszystko wydaje się niewinne, dopóki nie zaczynasz liczyć.
Na przykład:
  • Mamy 3 rodzaje pizzy i chcemy wybrać 2 — to tylko 3 warianty.
  • Ale jeśli mamy 20 dodatków i chcemy wybrać dowolną kombinację? Już ponad milion wariantów!
W matematyce jest to związane z kombinatoryką - działem, który bada sposoby wyboru i porządkowania obiektów.
W programowaniu, sztucznej inteligencji czy teorii gier eksplozja kombinatoryczna to prawdziwy wróg. Na przykład, w szachach liczba możliwych pozycji po 5 ruchach to ponad 69 miliardów. Przeszukiwanie wszystkich wariantów jest po prostu niemożliwe — potrzebne są optymalizacje, heurystyki i strategie omijające.
Eksplozja kombinatoryczna to sytuacja, w której "wszystko policzyć" staje się niemożliwe, ponieważ wariantów jest zbyt wiele. 
Termin brzmi nieco dramatycznie - i nie bez powodu. Dobrze ilustruje, jak szybko z prostego zadania może wyrosnąć prawdziwa matematyczna burza.

Eksplozja kombinatoryczna przy tworzeniu nowej klasy w Ruby

W Ruby (jak i w innych językach OOP) eksplozja kombinatoryczna może wystąpić, gdy próbujesz przewidzieć wszystkie możliwe kombinacje zachowań obiektów lub zależności między parametrami klasy.
Przykład nieudanego projektowania klasy Notification:
class Notification
  def initialize(user:, type:, channel:, urgency:)
    @user = user
    @type = type         # :comment, :like, :mention, :follow
    @channel = channel   # :email, :sms, :push
    @urgency = urgency   # :low, :medium, :high
  end

  def deliver
    # logic based on all combinations
  end
end
Teraz mamy:
  • 4 typy zdarzeń (:comment, :like, :mention, :follow)
  • 3 kanały wysyłania (:email, :sms, :push)
  • 3 poziomy pilności (:low, :medium, :high)
To już 4 × 3 × 3 = 36 kombinacji, z których każda potencjalnie wymaga osobnej logiki dostarczania (deliver). Dodaj jeszcze 2 parametry — i już setki wariantów, które trudno przetestować i utrzymać.

Jak uniknąć eksplozji kombinatorycznej?

1. Obiekty-strategie:
class EmailNotificationStrategy; def deliver; ...; end; end
class PushNotificationStrategy; def deliver; ...; end; end
2. Podziel odpowiedzialność (SOLID):
  • Notification nie powinien wiedzieć wszystkiego o wszystkich kanałach.
  • Każdy kanał sam realizuje swoje zachowanie.
3. Metaprogramowanie (trzeba robić z głową):
rubyCopyEditdefine_method("deliver_#{channel}_#{type}_#{urgency}") do
  # ...
end
Jednak jeśli metod jest 100+, to tylko pogorszy sytuację. Eksplozja kombinatoryczna w klasie występuje, gdy próbujesz "wszyć" do klasy zbyt wiele wariantów logiki związanych z kombinacją parametrów. Z czasem prowadzi to do nieczytelnego kodu, błędów i bólu.

Ten post nie ma jeszcze żadnych dodatków od autora.

5 cze 01:52

[Fixed] niezainicjowana stała ActiveSupport::LoggerThreadSafeLevel::Logger (NameError)

meme code
meme code@memecode
Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały
5 cze 18:23

Podgląd w zakładce network po aktualizacji Chrome stał się bardzo mały

meme code
meme code@memecode
Czym jest format HEIC i dlaczego proste zmienienie jego nazwy na .jpg to zły pomysł
15 cze 18:17

Czym jest format HEIC i dlaczego proste zmienienie jego nazwy na .jpg to zły pomysł

meme code
meme code@memecode
Dlaczego wybór CMS jest ważny podczas tworzenia strony internetowej?
29 cze 12:34

Dlaczego wybór CMS jest ważny podczas tworzenia strony internetowej?

meme code
meme code@memecode
Błąd 403 na stronie: co to oznacza i jak go naprawić
24 lip 23:50

Błąd 403 na stronie: co to oznacza i jak go naprawić

meme code
meme code@memecode
Co to jest vibe coding?
25 lip 21:51

Co to jest vibe coding?

meme code
meme code@memecode
Co to jest stos mózgowy (brain stack)?
28 lip 19:37

Co to jest stos mózgowy (brain stack)?

meme code
meme code@memecode
Co to jest przepełnienie całkowite?
15 sie 08:28

Co to jest przepełnienie całkowite?

meme code
meme code@memecode
Co to jest plik HAR (HTTP Archive)?
25 sie 18:23

Co to jest plik HAR (HTTP Archive)?

meme code
meme code@memecode
Czym jest Bubble Sort (wyjaśnienie algorytmu)?
16 wrz 18:42

Czym jest Bubble Sort (wyjaśnienie algorytmu)?

meme code
meme code@memecode
Czym jest wzrost eksponencjalny?
16 wrz 18:57

Czym jest wzrost eksponencjalny?

meme code
meme code@memecode
Czym jest złożoność faktorialna?
16 wrz 19:03

Czym jest złożoność faktorialna?

meme code
meme code@memecode