J'ai un code source nécessaire pour être converti en créant des classes, des objets et des méthodes.
Jusqu'à présent, je viens de faire en convertissant la principale initiale en une classe distincte. Mais je ne sais pas quoi faire avec le constructeur et quelles variables sont censées être privées. Ceci est le code: La classe principale est la suivante: p> dois-je simplifier la classe de cartes en créant d'autres classes? P > à travers ce code, mon Javadoc n'a pas de constructeur. Donc j'ai besoin d'aide sur cela! P> p>
6 Réponses :
Malheureusement, le meilleur moyen de convertir un programme "procédural" pour être "OO" consiste à le construire à partir de zéro. P>
Concevez votre modèle d'objet et la fonctionnalité que vous pensez que chaque objet doit avoir et écrire les classes et les talons de méthode. P>
Ensuite, vous pouvez éventuellement revenir à votre code d'origine et tirer une partie de ce fonctionnel hors de la (des) procédure (s) et dans les objets. P>
Mais le but est que je ne sais pas quelles variables devraient être le privé ou le public. Et quel devrait être le constructeur pour chaque classe. C'est ce qui m'a fait flou pendant des heures ..
Mon point (probablement pas clair) est que la programmation OO et la programmation procédurale constituent une conception différente et ne faisant pas seulement des variables publiques / privées et d'encapsuler des méthodes dans des classes. Par conséquent, pour "commencer", vous devez concevoir votre modèle d'objet. Répertoriez tous les objets possibles, tels que la carte, la carte, le jeu, etc. et comment ils correspondent ensemble et interagissent les uns avec les autres.
Je ne suis pas d'accord. Le refactoring est presque toujours moins cher que de réécrire. Prenez de petites étapes d'identification des concepts qui ont une utilité à OO - c'est-à-dire qu'ils peuvent être encapsulés. Facteur ceux-ci dans de nouveaux objets ... et assurez-vous que le code fonctionne toujours. Si vous écrivez à partir de zéro, vous n'aurez probablement rien de travail pendant une longue période - cela est généralement inacceptable dans l'industrie ... et conduit de nombreux projets de réécriture à l'échec.
Ce n'est pas un refactoring, cela change efficacement la langue. Je conviens que vous devriez réutiliser autant que possible le code que possible, mais si vous voulez suivre une approche OO, vous n'avez d'autre choix que de concevoir d'abord un modèle d'objet.
D'accord. L'approche doit être envisagée sur la base du problème, pas sur le code existant ... mais une fois qu'une bonne approche est conçue, il devrait être possible de refroidir dans ce domaine, de maintenir la fonctionnalité tout en fonction. Parfois, ce n'est pas possible - mais c'est généralement.
Toutes sortes de Odeurs peut être trouvé dans ce code. Si vous voulez vraiment faire un code agréable de celui-ci, lisez le chapitre refactoring de Fowler par chapitre et appliquez toutes les connaissances acquises immédiatement. P>
Une autre approche est simplement ne le touche pas, "ne réparez pas le moteur de travail". P>
Cela ressemble au jeu de mémoire classique, à l'aide de cartes. Je vois quatre classes principales:
Voici quelques propriétés et méthodes suggérées pour chacun. C'est incomplet, mais cela devrait vous faire aller. P>
Game previewDuration selectedRow selectedColumn selectedMatchRow selectedMatchColumn deck grid main() promptForColumn() promptForRow() preview() loadGrid() Deck cardCount shuffle() getNextCard() Card caption equals() Grid width height getCardAtPos()
Cette réponse illustre une refactorisation possible que vous pouvez faire pour rendre votre approche plus orientée objet. Il ne traite pas du domaine problématique (cartes, ponts, etc.), qui sont traités par d'autres réponses. Au lieu de cela, il décrit comment vous pouvez utiliser des principes OO pour faire face à la mise en œuvre programmatique de manière plus OO.
La première étape que je ferais est de faire sur ce que je vais appeler la construction de NovedLoop. Vous avez une boucle do / tandis que vous appuyez sur l'utilisateur, qu'il s'agisse de courir ou de ne pas exécuter oui, il fait une action. P>
Prenez cette fonctionnalité et encapsulez-la. Faites de la carte un objet runnable et laissez-la de l'exécuter à plusieurs reprises. P> alors, il ne peut s'agir d'une seule instance d'une action de jeu et ne doit pas avoir à Intégrer la fonctionnalité de boucle. Vous avez ensuite la possibilité de réutiliser le message NOUVELDLOOP pour d'autres programmes et vous pouvez lire plus facilement .Play comme vous n'êtes pas distrait par le fait que cela pourrait être bouclé. P> P>
Avant de vous inquiéter des objets, vous devez d'abord séparer au moins des sections en méthodes nommées, il est donc plus clair que chaque partie fait. C'est important que ce soit OO ou non. Par exemple:
for (int i =0; i<4;i++){ for (int j=0;j<4;j++){ System.out.print(cards[i][j]); System.out.print(" "); } System.out.println(""); System.out.println(""); }
Mais je ne sais pas quoi faire avec constructeur et quelles variables sont censées être privées. P>
Peu importe ce qui peut être, devrait être
privé code>. Pour déterminer cela, il est souvent plus facile de marquer tout em>
privé code>, puis lorsque vous frappez un "Point de douleur", promouvez-le à
public code>. p>
Quant aux cours dont vous avez besoin, jetez un coup d'œil au code existant pour "odeurs" tels que: p>
xxx pré> vous avez une "primitive nommée" 1 sup> là - et il est utilisé assez souvent. Cela en fait un nom important à votre programme. Encapsulez-le dans une classe: p>
xxx pré> maintenant, cherchez où vous manipulez la primitive nommée: P>
public class Cards { private int width; private int length; private int[][] cards; public Cards(int length, int width) { this.length = length; this.width = width; this.cards = new int[length][width]; } public void shuffle() { // existing shuffle method goes here - but works with private cards } public void print() { for (int i = 0; i < length; i++){ for (int j = 0; j < width; j++){ System.out.print(cards[i][j]); System.out.print(" "); } System.out.println(""); System.out.println(""); } }
+1 bons conseils, mais au lieu de promouvoir de privé au public, promouvoir d'abord au paquet-privé, puis protégé / public
Un commentaire à faire, je collerais votre complet i> code dans un service comme: Pastebin.com a > Juste pour que cela n'interfère pas avec votre question.
@Antomthony: En fait, la pratique standard sur SO si je comprends, c'est précisément pas i> de le faire. Vous pourriez collez la chose entière à la fin de votre question pour éviter d'interrompre le flux de questions, mais lorsque j'ai vu des gens pâtes hors site et de liens, ils ont été informés de ne pas le faire. Je pense que l'objectif est de rester tellement autonome en termes de question et de réponse réelles (par conséquent, les réponses de liaison-seules ne sont pas découragées également).
C'est une bonne question - qu'est-ce que l'aiderait aurait d'abord revisiter ce que vous essayez de faire. Mettez des commentaires tout au long de votre code de procédure pour nous expliquer (et vous-même) ce que vous essayez d'accomplir. Cela aidera à formuler le problème qui peut alors être pris en compte dans un autre paradigme. Les procédures de portage aveuglément aux objets ne sont généralement pas utiles pour personne.
Je ne suis pas d'accord avec Anthony. Le code est important pour la question et pour des raisons archivisibles, je ne voudrais pas mettre le code sur un site internet distinct. En outre, nous avons des barres de défilement.
Je pense qu'une grande amélioration est déjà de supprimer tous les
vide.out.println ("") code>. Vous pouvez obtenir une nouvelle ligne avec le caractère
\ n code>. Par exemple.
system.out.println (cartes [r] [c] + "\ n \ n"); code> crée deux nouvelles lignes après l'impression de
[r] code >.
J'ai bien peur que vous vous concentrez sur les mauvaises questions. "Quelles variables devrait être privée" est facilement répondu: tous ceux qui peuvent. Et "Que dois-je faire avec le constructeur?" est en arrière - ce qui entre dans le constructeur - si quelque chose - est ce qui doit être là pour répondre aux besoins de votre programme. Ce sont des questions débutantes et je ne critique pas cela, suggère simplement que votre attention devrait être réapprovisionnée.