Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – Strategy (stratégia)

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Kit
Tvůrce
Avatar
Kit:28.8.2012 12:13

Schéma je sice hezké, ale ocenil bych i ukázku konkrétní implementace v nějakém jazyku. Aby to posloužilo i k výuce návrhového vzoru, protože v této podobě to většině programátorů nic neřekne.

Odpovedať
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:28.8.2012 12:23

Já myslím, že jim to řekne to samé, class diagram je přeci 1:1 s kódem. Pokud někdo neumí základní UML notaci, pak je to začátečník a ten nepotřebuje návrhové vzory.

Ukázky kódu doplním v druhé vlně.

Odpovedať
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:28.8.2012 12:53

Je rozdíl, jestli děláš encyklopedii nebo tutoriál. V tutoriálu by mělo být dodrženo základní pravidlo výuky: Od konkrétního k abstraktnímu. Tedy nejprve napsat problém, potom konkrétní program, který ho řeší a nakonec zobecněné schéma. Ten prostředek jsi přeskočil tak, jak se to s oblibou dělává na VŠ přednáškách.

Ještě jsem nenašel žádný rozumně udělaný tutoriál na výuku UML. A knihy na tom nejsou o mnoho lépe.

Odpovedať
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:28.8.2012 12:57

UML je na cestě, jsou hotové 3 díly, ale stále se nějak zasekává. Skoro to vypadá, že se toho zase budu muset chopit sám. Nicméně tu bude, proto jsem vytvořil tu kategorii návrh.

Dělám encyklopedii vzorů. Vždy uvedu motivaci, kde je problém, který vzor řeší. Poté uvedu abstraktní vzor. Poté uvedu konkrétní příklad s kódem. Poslední krok zde bude až v 2. vlně, protože ho vnímám jako druhořadý.

Odpovedať
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovedá na David Hartinger
Kit:28.8.2012 13:11

Pokud to děláš jako encyklopedii, tak je to v pořádku. Jen to není tak názorné jako tutoriál.

V každé významnější práci jsou druhořadé záležitosti vždy uprostřed. Vše podstatné je v úvodu nebo v závěru.

Odpovedať
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na Kit
David Hartinger:28.8.2012 14:10

V tom případě tam bude motivace a praktický příklad, abstrakce bude uprostřed.

Ctím inkrementální (iterativní) přístup, proto příklady zatím píši jen do textu a jako zdrojový kód je uvedu v další vlně. Raději se nyní probojuji dalšími vzory, docela mě to baví :)

Odpovedať
New kid back on the block with a R.I.P
Avatar
Ondřej Krsička:28.9.2016 20:28

Už jsem to párkrát použil. Až teď ale vím, že se to jmenuje Strategy :D

Avatar
Luboš Rendl
Člen
Avatar
Luboš Rendl:3. marca 22:56

No podle komentářu na to asi nikdo nesáhl od 2012 :D

Avatar
Miroslav Kortus:Včera 20:23

Možná by byla ještě vhodná ukázka kódu.

Avatar
DarkCoder
Člen
Avatar
Odpovedá na Miroslav Kortus
DarkCoder:Včera 21:29

Zde máš kód ukazující funkcionalitu Strategy Patternu v C

/*
 * Klíčové body Strategy Patternu:
 * 1. Rodina algoritmů: bubble_sort, quick_sort, insertion_sort
 *    - všechny mají stejné rozhraní: void func(int[], int)
 * 2. Ukazatel na funkci (SortStrategy) slouží jako rozhraní strategie
 * 3. Pole strategies[] obsahuje všechny dostupné strategie
 * 4. Strategie se volí dynamicky přes index
 * 5. Hlavní program (kontext) nezná konkrétní implementaci algoritmu
 */

#include <stdio.h>

typedef void (*SortStrategy)(int[], int);

void bubble_sort(int arr[], int n) {
    for (int i = 0; i < n-1; i++)
        for (int j = 0; j < n-1-i; j++)
            if (arr[j] > arr[j+1]) {
                int tmp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = tmp;
            }
}

void quick_sort_recursive(int arr[], int low, int high) {
    if (low < high) {
        int pivot = arr[high];
        int i = low - 1;
        for (int j = low; j < high; j++)
            if (arr[j] <= pivot) {
                i++;
                int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
            }
        int tmp = arr[i+1]; arr[i+1] = arr[high]; arr[high] = tmp;
        int pi = i+1;
        quick_sort_recursive(arr, low, pi-1);
        quick_sort_recursive(arr, pi+1, high);
    }
}
void quick_sort(int arr[], int n) {
    quick_sort_recursive(arr, 0, n-1);
}

void insertion_sort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while(j >= 0 && arr[j] > key) {
            arr[j+1] = arr[j];
            j--;
        }
        arr[j+1] = key;
    }
}

void print_array(int arr[], int n) {
    for(int i=0; i<n; i++) printf("%d ", arr[i]);
    printf("\n");
}

int main() {
    int data[] = {64, 34, 25, 12, 22, 11, 90};
    int n = sizeof(data)/sizeof(data[0]);

    SortStrategy strategies[] = {bubble_sort, quick_sort, insertion_sort};
    const char* strategy_names[] = {"Bubble Sort", "Quick Sort", "Insertion Sort"};
    int num_strategies = sizeof(strategies)/sizeof(strategies[0]);

    int choice;

    while(1) {
        printf("Vyber strategii pro řazení (0 = konec):\n");
        for(int i=0; i<num_strategies; i++)
            printf("%d = %s\n", i+1, strategy_names[i]);
        printf("Tvoje volba: ");
        scanf("%d", &choice);

        if(choice == 0) break;

        if(choice < 1 || choice > num_strategies) {
            printf("Neplatná volba!\n");
            continue;
        }

        SortStrategy current_strategy = strategies[choice-1];

        int arr_copy[n];
        for(int i=0; i<n; i++) arr_copy[i] = data[i];

        printf("Původní pole: ");
        print_array(arr_copy, n);

        current_strategy(arr_copy, n);

        printf("Seřazené pole: ");
        print_array(arr_copy, n);
        putchar('\n');
    }

    return 0;
Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 10.