8
votes

Un moyen plus simple d'écrire la classe de calculatrice dans OOP PHP

J'ai créé une classe appelée calculatrice avec la fonction Ajouter, soustraire, multiplier et diviser. La calculatrice est limitée à ajouter deux nombres et à renvoyer le résultat. Je suis relativement nouveau à OOP, aimerais avoir une contribution sur la classe, ai-je pris la longue route et si je l'ai fait, il y a une autre façon de simplifier la classe.

Voici le code: P>

class Calculator {
    private $_val1 , $_val2;

    public function __construct($val1, $val2){
        $this->_val1 = $val1;
        $this->_val2 = $val2;
    }

    public function add(){
        return $this->_val1 + $this->_val2;
    }

    public function subtract(){
        return $this->_val1 - $this->_val2;
    }

    public function multiply (){
        return $this->_val1 * $this->_val2;
    }

    public function divide () {
        return $this->_val1 / $this->_val2;
    }
}

$calc = new Calculator(3,4);
echo "<p>3 + 4 = ".$calc->add(). "</p>";

$calc = new Calculator (15,12);
echo "<p>15 - 12 = ".$calc->subtract(). "</p>";

$calc = new Calculator (20,2);
echo "<p> 20 * 2 = ".$calc->multiply(). "</p>";

$calc = new Calculator (20,2);
echo "<p> 20 / 2 = ".$calc ->divide(). "</p>";


3 commentaires

Veuillez prendre une minute pour aligner le code correctement. Il est à peine possible de lire le code quand il est tout gâché.


L'aligna pour vous. :-)


ah désolé, je suppose que nous avons édité en parallèle :)


6 Réponses :


0
votes

Vous devriez probablement finir par faire quelque chose comme xxx

jeter un coup d'oeil à cet exemple. Vous pouvez donner n'importe quel nombre d'arguments comme celui-ci à l'aide de func_num_args () xxx


0 commentaires

1
votes

En général, nous ne fixons pas de valeur dans ce genre de classe. Vos méthodes devraient prendre leurs 2 valeurs par des arguments au lieu de choisir des membres privés.

Comme ce qui suit: xxx

Ainsi, la calculatrice devient un outil, et nous n'avons pas besoin de allouer ce genre d'objet. C'est pourquoi les méthodes de calcul des calculatrices doivent être statiques . xxx

de cette manière, tout ce que vous devez appeler est calculatrice :: Ajouter (1, 2) . Vous pouvez trouver ces types de cours partout. Comme vecteur, matrice en mathématiques ou 3D. Ou écrivez à la sortie ou à quelque chose comme ça.

N'oubliez pas que c'est un moyen de le faire, ni le meilleur ni le pire.


2 commentaires

Utiliser des méthodes statiques réduit la vérification de la qualification . Ils peuvent être une bonne idée de simples fonctions utilitaires qui calculent une formule (comme dans ce cas), mais si vous souhaitez que vos classes soient testables, n'utilisez pas de méthodes statiques.


Vous pourriez aimer lire sont des méthodes statiques / variables, une mauvaise pratique? - cette réponse de Mec est un "oui" défini. Je serais d'accord.



2
votes

Je ne pense pas qu'une calculatrice simple est un bon exemple pour OOP. Un objet a besoin d'un ensemble de méthodes et d'un ensemble de variables qui représentent son état et peuvent être utilisés pour différencier des instances de l'objet. Je suggérerais d'essayer de faire des calculatrices "Moody". Une calculatrice avec une bonne humeur ajoutera 2 à chaque résultat et une calculatrice en colère soustraire 2 de chaque résultat.


0 commentaires

8
votes

IMHO, vous devez utiliser le polymorphisme.
Cette vidéo peut vous aider à comprendre ce principe

Voici ma façon de penser. p>

Tout d'abord, définissez une interface pour toutes les opérations dont vous auriez besoin p> xxx pré>

puis, créez le support de calculatrice p> xxx pré>

Ensuite, vous pouvez définir une opération, par exemple, addition p> xxx pré>

et vous l'utiliseriez comme: p> xxx pré>

Avec ce point, si vous souhaitez ajouter un nouveau comportement, ou modifiez une classe existante, créez ou modifiez une classe. P>

Par exemple, dites que vous voulez une opération de module P>

- app/
    - lib/
        - Calculator/
            - Operation/
                - Addition.php
                - Modulus.php
                - Substraction.php
            - OperationInterface.php
            - Calculator.php


3 commentaires

Peut-on aussi bien mettre des capacités de chaînage pour faire echo $ calculatrice-> setoperands (tableau (4,2)) -> setoperation (nouvel ajout) -> processus (); possible?


Ajouter simplement Renvoyer $ ceci; sur setoperands et setoperation méthodes


J'aime Stackoverflow.



0
votes

Cette tâche a beaucoup de solutions, voici l'un d'entre eux: xxx

et voici une belle solution https://gist.github.com/cangelis/1442951


1 commentaires

J'ajouterais certainement un cas par défaut (avec une exception) au commutateur pour protéger contre les typos et les opérandes inconnus. De plus, vous devriez jeter une exception au lieu de faire un écho. Sans exceptions, le code reviendra des résultats indéfinis, entraînant des messages d'erreur PHP et / ou un comportement étrange. En dehors de cela, voir mon autre commentaire pour la suggestion de ChanDresh_cool.



2
votes

Je ferais quelque chose comme ça xxx

de cette façon, vous pouvez facilement ajouter de nouvelles opérations xxx

et opérations de chaîne comme celle-ci xxx


3 commentaires

Ma réponse est similaire à celle de Touki. Nous avons tous tous deux vu la grande vidéo de Misko: p


Avez-vous vérifié le script? Vous avez deux choses manquantes sur le premier coup d'œil: noeud de classe ne met pas en place la méthode évalue () et la valeur de la classe n'a pas de méthode < Code> Valeur () , juste une propriété valeur . Mais à part cela, c'est bon d'obtenir l'idée de motif! (Y)


Oups, je viens de comprendre que sur PHP> = 5.4 Vous pouvez avoir les méthodes "interfacées" implémentées dans une extension de classe ...