De wederopbouw van oudere code: 5

, de herstructurering van oude code 5 spel: methode voor het testen van de,,,,,,,,,, 28, 5 - eenheid,,,,,,,, de delen van het netwerk, maandag wat in tuts + koers zal dalen tot slechts drie dollar.Niet' dit artikel niet missen, is dat een reeks voor de wederopbouw van een deel van de oude code. De wederopbouw van oudere code: 4 - onze eerste eenheid testsrefactoring oudere code: 6 - aanval van ingewikkelde methode, de oude code.De code is lelijk.Een complexe code.Spaghetti - code.Bla, bla.Twee woorden, oude code.Dit is een reeks, zal je helpen werk en verwerking, in onze vorige handleiding, we testen we de functie van de lopers.In deze les, die we zullen doorgaan met ons spelen, het spel, klas, we vertrekken.Nu, als je begint met zo 'n grote deel van de code, zoals we hier, het is gemakkelijk te beginnen met het testen van de top - down - aanpak en methoden.Dit is het, het grootste deel van de tijd, kan het niet worden.Het is beter te beginnen met het testen van het korte, kan de test methode.Dit is ons in deze les heeft gedaan: het zoeken naar en het testen van deze methode, en het creëren van een wedstrijd, voor het testen van een klasse, moeten we op een voorwerp van een bepaald type gestart.We kunnen overwegen, onze eerste test is het creëren van een nieuw doel.Je zou verbaasd zijn hoeveel geheimen te verbergen, require_once, __dir__. "////////PHP /trivia spel. Php; uitbreiding van de functie van gametest phpunit_framework_testcase {testwecancreateagame () {% spel = nieuwe spel ();}}, tot onze verbazing, spel, dat is gemakkelijk kan worden gecreëerd.Geen probleem, terwijl de werking van het spel, de nieuwe (').Geen rust.Dit is een goed begin, met name gelet op het spel, de constructeurs, zijn aanzienlijk, en het deed veel dingen vinden, en de eerste test, het is makkelijk, vereenvoudiging van de fabrikant.Maar we hebben alleen de gouden meester, om ervoor te zorgen dat we niet iets gebroken.We gaan voor de fabrikant in de meeste, we moeten testen.Dus, waar moeten we beginnen?Op zoek naar een terugkeer van de waarde van de methode, en zich afvragen: "Ik kan bellen en de controle van de waarde van deze methode?"Als het antwoord ja is, is dat we de test van de goede kandidaten.,, functie isplayable () {% minimumnumberofplayers = 2; inkomen ($dat howmanyplayers ()% GT%% GT% = $minimumnumberofplayers);}, is deze methode?Lijkt me een goede kandidaat.Slechts twee lijnen, die weer een booleaanse.Maar wacht, het wordt een andere methode, howmanyplayers (),.,, de functie van howmanyplayers () {terug tellen ($- > spelers);}, en dit is in feite een methode, het tellen van de elementen van de spelers, de categorie, de generator.Oké, dus als we niet nog een speler moet nul zijn.(de), isplayable moet vals.Laten we eens kijken of we de veronderstelling is correct.,, functionele testajustcreatednewgameisnotplayable () {% spel = nieuwe spel (); de dollar - > assertfalse ($spel > isplayable ());}, dat we voor ons om rekening te houden met de vorige methode voor het testen van wat we echt willen testen.En dan zeggen we geen spelletjes spelen.De test.Maar in veel gevallen vals - positieve resultaten zijn normaal.Zo 'n stuk betreft, kunnen we stellen dat de echte test niet en zeker.,, - dollar > asserttrue ($spel > isplayable ()); en het,,.,, phpunit_framework_expectationfailedexception: bevestiging van het falen is echt en vals, tot nu toe, veelbelovend.We testen de methode met succes van de oorspronkelijke waarde, is de waarde van de oorspronkelijke staat, de staat, de spelletjes, klasse - waarde.Let op die wijzen op een woord: "staat".We moeten een manier vinden om de controle op het spel staat.We moeten om het te veranderen, dus het zal een minimumaantal spelers.,, als we het over, het spel,, (), dan zien we dat het onze - element toe te voegen aan de array_push (.,,, - > is in verband met de dollar);,, onze hypothese is Door de manier, () de voor de uitvoering van, de methode is het gebruik van runnerfunctions PHP,.,.,, de functie van het (de) {% spel = nieuwe spel (); $spel - > toevoeging van ("chet"); een spel - > toevoeging van ("Pat"); een spel - > toevoeging van (Sue "); ///////.../), op basis van deze opmerking, wij conclusies kunnen worden getrokken, door het gebruik van (de), twee keer, kunnen we ons spel, twee spelers in de staat. Testafteraddingtwoplayerstoanewgameitisplayable, functie, () {% spel = nieuwe spel (); $spel > toevoeging van (de eerste speler); en het spel - > toevoeging van (de tweede speler); de dollar - > asserttrue ($spel > isplayable ());}, deze keer, bij de methoden voor het testen van de garantie, kunnen we terug waar isplayable (), als aan de voorwaarden wordt voldaan, Maar, misschien denk je dat dit een test is geen eenheid.We gebruikte methode, ().We maken meer dan het minimum van de code.We kunnen alleen nog elementen voor de spelers, en niet op de reeks, (), voor alle. En de, uh, ja, we kunnen dit niet doen, vanuit het oogpunt van de technologie.Het zal een van de voordelen van de directe controle van de generator.Maar het zal de code en het testen van de code herhaalde tekortkomingen.Dus, denk je dat je kan kiezen voor een leven samen slechte keuze.Persoonlijk heb ik een voorkeur voor hergebruik, (),,,,, we testen op de wederopbouw, groene, we verbouwen.We kunnen ons beter de test?Ja, we kunnen het.We veranderen onze eerste test om te controleren of de voorwaarden niet genoeg spelers, functie, testagamewithnotenoughplayersisnotplayable. () {% spel = nieuwe spel (); de dollar - > assertfalse ($spel > isplayable ()); en het spel > toevoeging van (een van de spelers); de dollar - assertfalse > ($spel > isplayable ());}, misschien heb je het gehoord van het concept van "een bewering van elke test".Ik ben het eens met de meeste, maar als je een test, om na te gaan of een gemeenschappelijk concept, en eisen dat een aantal beweringen te verifiëren, en ik denk dat het aanvaardbaar is dat het gebruik van meer dan één.Dit standpunt is ook sterk bevorderd door Robert G. Martin in z 'n leren.,, maar onze tweede test?Dit is niet goed genoeg?Ik zei nee, spel, $> toevoeging van (de eerste speler); $spel > toevoeging van (de tweede speler);,, deze twee telefoon stoort me een beetje.Ze is een gedetailleerd verslag over de uitvoering niet uitdrukkelijk te verklaren dat, in onze aanpak.Waarom zou ze dat niet uit een privé - methode?,, functionele testafteraddingenoughplayerstoanewgameitisplayable () {% spel = nieuwe spel (); de dollar - > addenoughplayers ($spel); de dollar - > asserttrue ($spel > isplayable ());} privé functie addenoughplayers ($spel) {% spel > toevoeging van (de eerste speler) spel - > en; toegevoegd (tweede speler ");}, dat is beter, dit hebben we een ander concept, we hebben het gemist.In beide onderzoeken wij op de een of andere manier zegt "genoeg spelers" - concept.Maar hoeveel is er?Is het niet?Ja, het is nu.Maar we hopen dat we de test niet, als het spel, logica, moeten ten minste drie spelers?We willen niet dat dat gebeurt.We kunnen de invoering van een op het gebied van de statische klasse, spelletjes, en statische minimumnumberofplayers dollar (= 2; ///////...//////////////__construct (functie) {...///////isplayable () {} functie terug (het howmanyplayers ($)% GT%% GT% = zelf: minimumnumberofplayers dollar) ///////.}./), waarmee we het gebruiken in onze test, privé - functie, addenoughplayers ($spel) {($I = 0; ik < spel:: minimumnumberofplayers dollar; I + +) {% spel > toevoeging van (een van de spelers);}}, onze kleine assistent van de methode alleen maar zal toenemen tot genoeg spelers bij.We kunnen zelfs tot onze eerste test nog een van deze methoden, zodat we meer genoeg spelers.,, functie testagamewithnotenoughplayersisnotplayable () {% spel = nieuwe spel (); de dollar - > assertfalse ($spel > isplayable ()); de dollar - > addjustnothenoughplayers ($spel $); - > assertfalse ($spel > isplayable ());} privé functie addjustnothenoughplayers ($spel) {($I = 0; ik < spel:: $1 dollar minimumnumberofplayers; I + +) {% spel > toevoeging van (een van de spelers);}}, maar dit leidt, een dubbel.Onze twee aanvullende methoden is vergelijkbaar.Kunnen we niet gewoon de winning van hen een derde?Privé - functie, addenoughplayers ($spel) {% dit > addmanyplayers ($spel:: minimumnumberofplayers dollar);} privé functie addjustnothenoughplayers ($spel) {% dit > addmanyplayers ($spel: minimumnumberofplayers dollar: 1);} privé functie addmanyplayers ($spel, numberofplayers dollar) {($I = 0; ik < numberofplayers dollar; I + +) {% spel > toevoeging van (een van de spelers);}}, dat is mooi, maar het is een heel andere kwestie.Wij in deze methoden ter vermindering van het duplicaat, maar we spelen, is nu door de drie niveaus.De administratieve moeilijkheden steeds moeilijker wordt.Het is tijd om het te testen starten, val (), methoden en het hergebruik van het,, gametest uitbreiding van klasse. Phpunit_framework_testcase {particuliere $spel; de functionele opzet () {% van dit nieuwe spel spelen > testagamewithnotenoughplayersisnotplayable (functie);} {% dit > assertfalse ($- > spel en isplayable (GT;)); de dollar - > addjustnothenoughplayers (); de dollar - > assertfalse ($- > spel > isplayable (})); de functie van testafteraddingenoughplayerstoanewgameitisplayable () {% dit > addenoughplayers ($- > spel); de dollar - > asserttrue (Euro - > spel > isplayable () privé - functie);} {addenoughplayers () dollar - > addmanyplayers (spel:: minimumnumberofplayers dollar); particuliere functie addjustnothenough}- spelers () {% dit > addmanyplayers (spel: minimumnumberofplayers dollar: 1);} privé functie addmanyplayers ($numberofplayers) {($I = 0; ik < numberofplayers dollar; I + +) {% dit > spel > toevoeging van een speler (");}}}, dat is veel beter.De code is al niet in privé - methode, spelletjes, starten, val (), en een groot deel van de vervuiling van de methoden voor het testen van is verwijderd.Echter, we moeten hier een compromis te sluiten.In onze eerste test, we beginnen van een bewering.Dit betekent dat, val (), altijd het creëren van een lege ruimte op het spel.Nu kan het.Maar op het einde van de dag dag, je moet beseffen dat de code niet perfect.Alleen de code en het compromis, wil je je leven samen, mensen, de tweede test, als we ons gescand, spelletjes, van boven tot onder de categorie we de volgende op de lijst is (').Ja, we in onze test met dezelfde methode, een punt in het verleden.Maar we kunnen het testen?,, functionele testitcanaddanewplayer () {% dit > spel > toevoeging van (een van de spelers); de dollar - > dat het (1, tellen ($- > spel > spelers));}, is dit een andere manier testen object.We bellen onze methode, en we controleren of het voorwerp van de staat.Zoals, (), altijd terug, echt niet, we testen van de produktie.Maar we kunnen uit een lege, spelletjes, en dan de controles, als er één gebruiker, we er een.Maar dat er voldoende bewijzen?,, functionele testitcanaddanewplayer () {% dit > dat het (0, tellen ($- > spel > spelers)); de dollar - > spel > toevoeging van (een van de spelers); de dollar - > dat het (1, tellen ($dit - > spel > spelers));}, en zou het niet beter te kunnen controleren, als geen van de spelers in de oproep tot het (de),???????Oké, hier is misschien teveel, maar zoals u kunt zien op de code, we kunnen dit doen.Als je niet zeker bent van de oorspronkelijke staat, moet je het doen voor een bewering.Het kan je beschermen tegen toekomstige herziening van de code kan veranderen als je het voorwerp van een eerste lidstaat.,, maar we alles testen, (). De methode?Behalve de toevoeging van een gebruiker, die het ook veel geregeld.We moeten ook controleren, functie, deze. Testitcanaddanewplayer () {% dit > dat het (0, tellen ($- > spel > spelers)); de dollar - > spel > toevoeging van (een van de spelers); de dollar - > dat Het (1, tellen ($- > spel * de spelers)); de dollar - > dat het (0 dollar - > spel > plaats [1]); de dollar - > dat het (0 dollar - > spel - > portemonnee [1]); de dollar - > assertfalse ($- > [1 inpenaltybox spel >]);}, dat is beter.We bevestigen, () van elke actie en methoden.Deze keer, geef ik de voorkeur aan de directe meting van de spelers, $).Waarom?We kunnen het gebruik van methoden, howmanyplayers (), nagenoeg hetzelfde te doen, hè?Nou, in dat geval, zijn we van mening dat dit effect van de door de (), waarin wij voorstellen en, wat nog belangrijker is, de staat van het object.Als we moeten veranderen (), verwachten wij dat de test van de strikte gedrag, zal falen.Ik syneto collega 's in deze eindeloze discussie.Met name omdat dit soort testen, testen en hoe wordt ingevoerd, een sterke koppeling tussen (), is in feite de methode.Dus, als je het wil testen andersom, dat betekent niet dat je het verkeerd is, kunnen we veilig. En de produktie van niet, het testen, de echoln (), draad.Ze is gewoon op het scherm van de inhoud.We willen niet in contact komen met deze methode, maar.Onze gouden meester volledig afhankelijk zijn van deze produktie, wederopbouw, test (bis), we hebben een andere testmethode, door middel van een nieuwe methode voor het testen.Het is tijd voor de bereiding van hen, een klein beetje.Laten we uit onze test beginnen.De laatste drie beweert dat een beetje in de war?Ze lijkt niet op een strikte relatie meer spelers.Laten we het veranderen:,, functionele testitcanaddanewplayer () {% dit > dat het (0, tellen ($- > spel > spelers)); de dollar - > spel > toevoeging van (een van de spelers); de dollar - > dat het (1, tellen ($- > spel > de spelers)); de dollar - > assertdefaultplayerparametersaresetfor (1);}, dat is beter.Nu is de methode van de abstracte, herbruikbare en zinvolle nomenclatuur van verbergen en alle belangrijke details.,, wederopbouw, (), kan men met de codes van de producten zoiets.,, toe te voegen aan de functie van (een) {array_push ($- > is in verband met de dollar $); - > setdefaultplayerparametersfor ($- > howmanyplayers ()); echoln (verbonden. "De toevoeging "); echoln (" ze is speler nummer ".Tellen ($- > spelers); terug waar;}, halen we een onbelangrijke details, setdefaultplayerparametersfor (), private functie setdefaultplayerparametersfor (.,,, playerId) {% dit > waar [playerId] = 0 dollar; de dollar - > [0] = playerId tas van $; De dollar - > inpenaltybox [] = playerId valse $;}, eigenlijk het idee kwam naar me toe en ik schrijven na de test.Dit is een goed voorbeeld van hoe we testen, dwingt ons in een ander perspectief naar de code.Deze verschillende aspecten, is dat we gebruik moeten maken van de richtsnoeren voor de uitvoering van de tests en laten we ons ontworpen productie - code, een derde kan testen, laten we ons vinden in de drie kandidaat - test.(de), howmanyplayers, te simpel en indirect al getest.(), die veel te ingewikkeld, en direct kunnen worden getest.En het is leeg.(de), askquestions, liefde op het eerste gezicht lijkt leuk, maar het is niet terug te keren naar de waarde van de manuscripten.,,, currentcategory (), kunnen worden getest, maar het was mooi, moeilijk, test.Dit is een grote selectie, tien.We moeten een test, en dan moeten we serieus en belangrijk voor de wederopbouw en de test.We moeten constateren dat deze methode, en voordat we klaar zijn om terug te keren naar het.Voor ons, dit is onze volgende les,,,, wascorrectlyanswered (), het is ingewikkeld.We moeten de winning van de code in, klein, kunnen worden getest.Maar wronganswer (), het lijkt erop dat er hoop is.De dingen op het scherm, maar het verandert ook ons doel staat.Laten we eens kijken of we het kunnen controleren, testen, de functie, het testwhenaplayerentersawrongansweritissenttothepenaltybox. () {% dit > spel > toevoeging van (een van de spelers); de dollar - > spel > currentplayer = 0; de dollar - > spel > wronganswer (); de dollar het - > asserttrue ($- > spel > inpenaltybox [0]);},, oh...Deze methode voor het testen van schrijven is moeilijk.En wronganswer (), afhankelijkheid, de dollar - > currentplayer, het gedrag van logica, maar het is ook het gebruik van de dollar - > van de spelers, in zijn toespraak een deel van.Een voorbeeld van een lelijke, waarom je niet moet mengen van logica en demonstratie.We zullen in de toekomst in de behandeling van deze handleiding.Nu, we testen de gebruiker in een doos.Wij constateren dat er een, als (), in de verklaring van de methode.Dit is een van de voorwaarden, het is nog niet getest, want we hebben nog maar één speler, dus we niet tevreden zijn over de voorwaarden.We kunnen voor de uiteindelijke waarde, het testen van currentplayer dollar, hoewel.Maar de toevoeging van deze lijn zal de test gefaald.,, - dollar > dat het (1 dollar - > spel > currentplayer); en zorgvuldig te kijken naar de privé - methode, shouldresetcurrentplayer (), onthullen.Als de huidige spelers en spelers van de index is gelijk aan het aantal, het zal terug naar nul.Ik luister niet!Zijn we echt in, als ().,, functionele testwhenaplayerentersawrongansweritissenttothepenaltybox () {% dit > spel > toevoeging van (een van de spelers); de dollar - > spel > currentplayer = 0; de dollar - > spel > wronganswer (); de dollar - > asserttrue ($- > spel > inpenaltybox [0] dollar); - > dat het (0 dollar - > spel > currentplayer);} functie testcurrentplayerisnotresetafterwronganswerifotherplayersdidnotyetplay () {% dit > addmanyplayers (2); de dollar - > spel > currentplayer = 0; de dollar - > spel > wronganswer (); de dollar - > dat het (1 dollar - *; spel > currentplayer);}, heel goed.We hebben een tweede test voor het testen van specifieke gevallen, wanneer er geen van de spelers spelen.Het kan ons niet schelen, inpenaltybox, de tweede test.We alleen de spelers in de huidige indicatoren geïnteresseerd. En de laatste inspectie voor, de laatste methode, kunnen worden getest, en de wederopbouw van didplayerwin (,,,, didplayerwin). () {% numberofcoinstowin = 6; terug!(USD - > portemonnee [dollar - > currentplayer] = = $numberofcoinstowin);}, onmiddellijk kan worden geconstateerd dat het code vergelijkbaar in de structuur, isplayable (), de eerste, we testen.Onze oplossing zou zijn iets dergelijks.Als je de code is zo kort, slechts twee tot drie, doe een kleine stap is niet meer dan de grote risico 's.In het ergste geval, je weer drie lijnen van de code.Dus, laten we in een enkele stap doen, functie, testtestplayerwinswiththecorrectnumberofcoins. () {% dit > spel > currentplayer = 0; de dollar - > spel > portemonnee [0] = spel:: numberofcoinstowin dollar; de dollar - > asserttrue (Euro - GT; spel > didplayerwin ());}, maar wacht.Falen.Hoe is dat mogelijk?Niet door?We bieden de juiste hoeveelheid munten.Als we op onze manier, vinden we een beetje misleidend feiten.(USD - > portemonnee [dollar - > currentplayer] = = $numberofcoinstowin);,, naar waarde in feite negatief is.Dus, als een speler wint, zal hij het ons vertellen, als een van de spelers niet winnen, vertel het ons.We kunnen deze methode te vinden te plaatsen en te ontkennen dat de waarde.En dan verandert het gedrag hier niet vals - negatieve antwoorden.Maar het is, wascorrectlyanswered (), kunnen we geen eenheid, voor de test.Misschien is tijdelijk, een eenvoudig om op de juiste functie is genoeg.,, functionele didplayernotwin () {terug!(USD - > portemonnee [dollar - > currentplayer] = = zelf: numberofcoinstowin dollar);}, ideologische & conclusie, dus dit pakket training.Hoewel we niet van de ontkenning van de naam, het is een compromis, kunnen we op dit punt.Toen we begonnen met de wederopbouw van de rest van de code, die naam zeker veranderen.Bovendien, als je het nodig hebt in onze tests, ze ziet er vreemd uit, functie, testtestplayerwinswiththecorrectnumberofcoins: () {% dit > spel > currentplayer = 0; de dollar - > spel > portemonnee [0] = spel:: numberofcoinstowin dollar; de dollar - > assertfalse ($- > spel * ()); didplayernotwin;}, door het testen van fouten in de ontkenning van de methode, de uitoefening van de waarde, een echte resultaten, we hebben veel verwarring inleiding gaf ons de code van de leesbaarheid.Maar dit is goed, we hebben nu even een punt, toch?In onze volgende les, we gaan werken in een moeilijke, spelletjes, klasse.Dank je, lezen.



Previous:
Next Page: