2010-12-11 53 views
1

Si j'ai une fonction (par exemple messUp qui n'a pas besoin d'accéder à des variables privées d'une classe (par exemple room), devrais-je écrire la fonction dans la classe comme room.messUp() ou en dehors comme messUp(room)? Il semble que la deuxième version se lit mieux pour moi.Quelles fonctions mettre à l'intérieur d'une classe

Répondre

2

Il y a un compromis ici. En utilisant une fonction de membre vous permet de:

  • Remplacer la mise en œuvre dans les classes dérivées, de sorte que déconner une cuisine pourrait impliquer bousiller les armoires même si aucun placards sont disponibles dans une salle générique.
  • Décidez que vous devez accéder à des variables privées plus tard, sans avoir à refactoriser tout le code qui utilise la fonction.
  • Faire de la fonction une partie d'une interface, de sorte qu'un morceau de code puisse nécessiter que son argument soit discutable.

En utilisant une fonction externe vous permet de:

  • faire cette fonction générique, de sorte que vous pouvez l'appliquer aux chambres, les entrepôts et les plates-formes pétrolières tout aussi (si elles fournissent les fonctions membres nécessaires pour chambouler) .
  • Conservez une signature de classe réduite, de sorte que la création de versions fictives pour les tests unitaires (ou différentes implémentations) soit plus simple.
  • Modifier l'implémentation de la classe sans avoir à examiner le code pour cette fonction.

Il n'y a pas de véritable moyen d'avoir votre gâteau et de le manger aussi, alors vous devez faire des choix. Une décision commune OO est de tout faire une méthode (sauf si clairement idiot) et de sacrifier les trois derniers points, mais cela ne signifie pas que vous devriez le faire dans toutes les situations.

2

Tout comportement d'une classe d'objets doit être écrite comme une méthode d'instance.

Alors room.messUp() est la voie OO pour le faire.

que messUp h n'est pas pertinent, le fait que ce soit un comportement de la salle, suggère qu'il s'agit d'une méthode d'instance, comme le serait cleanUp ou paint, etc ...

0

Ignorer quelle langue , Je pense que ma première question est si messUp est lié à d'autres fonctions. Si vous avez un groupe de fonctions connexes, j'aurais tendance à les coller dans une classe. Si elles n'accèdent à aucune variable de classe, vous pouvez les rendre statiques. De cette façon, ils peuvent être appelés sans avoir besoin de créer une instance de la classe. Au-delà, je regarderais la langue. Dans certaines langues, chaque fonction doit être une méthode d'une classe. En fin de compte, je ne pense pas que cela fasse une grande différence. La POO est simplement un moyen d'aider à organiser les données et la logique de votre application. Si vous l'adoptez, alors vous choisirez room.messUp() sur messUp (room).

+0

-1 pour «Si vous l'adoptez» ... si vous utilisez un langage OO, il devrait être obligatoire dans n'importe quel environnement professionnel de l'utiliser comme il était prévu, et non selon le caprice de l'individu. C'est ainsi que nous finissons par coder les horreurs. – ocodo

+1

Si vous lisez son commentaire, vous verriez qu'il n'a pas dit qu'il utilisait une langue OO. Il demandait simplement ce qui est mieux, peu importe ce que cela signifie. De plus, les langages comme C++ ont habituellement des fonctions qui ne sont pas des membres de la classe. Et être nazi au sujet de l'approche que les gens adoptent pour le développement ne sert aucun objectif objectif. Donc, c'est faux pour vous ... –

+0

@Jonathan, -1 pour la loi de Godwins, ainsi que des mots clés manquants utilisés dans la question de l'OP. ... "accéder à toutes les variables privées d'une classe" quel langage non OO utilise des variables privées dans une classe? (ou même a des classes?!? l'esprit boggle.) - Maintenant, je ne serai pas en désaccord qu'il y a souvent de bonnes utilisations/raisons pour les fonctions même dans un système OO qui agissent de la façon dont 'messup (room)' agirait cependant ... 1. Parce qu'il me semble mieux me lire; 2. parce que je le ressens, ne sont pas de bonnes raisons. Mais pire encore est 3. Parce que je ne veux pas embrasser l'encapsulation dans une langue OO. – ocodo

0

Je me base sur "C++ Coding Standards: 101 Rules, Guidelines, And Best Practices" par Sutter et Alexandrescu, ainsi que SOLID de Bob Martin. Je suis d'accord avec eux sur ce point bien sûr ;-).

Si le message/la fonction n'intervient pas tellement avec votre classe, vous devriez en faire une fonction ordinaire standard prenant votre objet de classe en argument.

Vous ne devriez pas poluer votre classe avec des comportements qui ne lui sont pas intimement liés. Single Responsibility Principle: Votre classe doit rester simple, en visant le but le plus précis. Toutefois, si vous pensez que votre message/fonction est intimement lié à vos objets, vous devez l'inclure en tant que fonction membre de votre classe.