Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα σας, έστω ότι έχουμε υλοποιήσει αρκετά καλά ένα σύστημα και είναι όλα τα objects decoupled.

Στην μεριά του client όμως υπάρχει το μειονέκτημα  στο ότι χρειάζεται να πολυλογήσει κανείς ώστε να κάνει αυτό που θέλει, όπως για παράδειγμα πιο κάτω (στο οποίο το τελικό αποτέλεσμα είναι ένα array με links): 

$textArray = new TextArray();
$textArray->addTransformer(new UrlTransformer($parameter));
$textArray->addCleaner(new UrlCleaner(parameter));
$itemCollection = new ItemCollection();
$item = new Item(parameter1, parameter2, parameter3);
$itemCollection->add($item);
$collector = new Collector();
$collector->collect($itemCollection, parameter2);
$urls = $collector->collectedData;

Θα ήταν σωστό pattern να δημιουργήσω μια κλάση π.χ. "UrlGenerator" στην οποία να χώσω όλο το πιο πάνω και ο client το μόνο που να είχε να κάνει να ήταν κάπως έτσι:

$urlGenerator = new UrlGenerator(parameter1, parameter2, parameter3, parameter4)
$urls  = $urlGenerator->create()

 

 

 

Επεξ/σία από Click4Money
Δημοσ.

Χωρίς να ξεκινήσουμε τη φιλοσοφία, αυτό που λες είναι ΟΚ και μάλιστα υπάρχει και σε design pattern (όχι φιλοσοφία άλλα δεν ξέρω γιατί ανέφερες τον όρο καν) και λέγεται facade.

Φυσικά το αν είναι καλή ιδέα ή καταστροφή εξαρτάται από τις λεπτομέρειες της περίπτωσης και δεν υπάρχει αυτό το context, οπότε την απάντηση μου δες τη γενικά.

Δημοσ.

Ευχαριστώ πολύ @defacer θα το κοιτάξω. Κάποια στιγμή θα ανεβάσω το project στο github για να το δεις αν έχεις χρόνο. Θα μου ήταν πολύ χρήσιμες οι παρατηρήσεις σου στο να βελτιωθώ!!

Δημοσ.

@Click4Money δες και ένα μικρούλι παράδειγμα facade από δικό μου κώδικα (PHP).

Η ιδέα εδώ είναι πως η ReservoirSampler (υλοποιεί τον Algorithm R) σου δίνει ένα πολύ πολύ γενικό interface για να κάνεις ο,τι θες, αλλά επειδή στην πράξη 99% of the time δε σε ενδιαφέρει τόση λεπτομέρεια μπορείς να καλέσεις κατευθείαν την sample() για να κάνεις τη δουλειά σου "with reasonable defaults" και χωρίς πολλά πολλά.


final class ReservoirSampler
{
    /**
     * @var RandomnessSourceInterface
     */
    private $randomnessSource;

    private $reservoir;

    private $observedItemCount;

    public function __construct(RandomnessSourceInterface $randomnessSource, int $sampleSize)
    {
        $this->randomnessSource = $randomnessSource;
        $this->reset($sampleSize);
    }

    /**
     * @param \Traversable|array $input
     * @param int $sampleSize
     *
     * @return array
     */
    public static function sample($input, int $sampleSize): array
    {
        $sampler = new self(new MersenneTwisterRandomnessSource(), $sampleSize);
        foreach ($input as $item) {
            $sampler->observe($item);
        }

        return $sampler->getSample();
    }

    public function getSampleSize(): int
    {
        return count($this->reservoir);
    }

    public function reset(int $sampleSize)
    {
        $this->observedItemCount = 0;
        $this->reservoir = array_fill(0, $sampleSize, null); // what we initialize with should not actually matter
    }

    public function observe($item)
    {
        $sampleSize = $this->getSampleSize();

        if ($this->observedItemCount < $sampleSize) {
            $this->reservoir[$this->observedItemCount++] = $item;
        } else {
            $random = $this->randomnessSource->getNextRandom(0, $this->observedItemCount++);
            if ($random < $sampleSize) {
                $this->reservoir[$random] = $item;
            }
        }
    }

    public function canSample(): bool
    {
        return $this->observedItemCount >= $this->getSampleSize();
    }

    public function getSample(): array
    {
        if (!$this->canSample()) {
            throw new InsufficientInputException(
                sprintf(
                    'Cannot produce a sample of size %d because only %d items have been observed.',
                    $this->getSampleSize(),
                    $this->observedItemCount
                )
            );
        }

        return $this->reservoir;
    }
}

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...