Cela a Ă©tĂ© Ă l'origine ouvert pour un dĂ©fi spĂ©cifique, mais en remarquant quelques autres choses en cours de route dans cette section, je vais donc les consolider dans ce numĂ©ro (un commentaire pour chacun). @HKuz , s'il y a peut-ĂȘtre dĂ©jĂ un autre problĂšme Ă ce sujet, je suppose que vous serez le seul Ă savoir, j'ai fait une recherche rapide mais je n'ai rien trouvĂ©.
Dans l'ensemble, je pense que ces défis sont formidables! _ Certainement _ une _ amélioration majeure_ par rapport à la section OOP existante !!!! Bravo à celui qui les a créés !!
Ce défi n'accepte que les éléments suivants comme solution:
console.log(dog.name);
console.log(dog.numLegs);
Cependant, nous n'indiquons pas explicitement que 2 instructions distinctes doivent ĂȘtre utilisĂ©es, et ce qui suit ne passe pas:
console.log(dog.name, dog.numLegs);
Je pense que nous devrions soit spécifier que 2 déclarations distinctes console.log()
doivent ĂȘtre faites, soit refactoriser le test pour accepter les deux solutions - je pense que je prĂ©fĂ©rerais la derniĂšre option. PensĂ©es?
Expected an assignment of function call and instead saw an expression
lorsque la solution correcte myHouse instanceof House;
est écrite. Le défi passe cependant.function House(numBedrooms) {
this.numBedrooms = numBedrooms;
}
mais dans ce défi, ils passent à cette syntaxe:
let House = function(numBedrooms) {
this.numBedrooms = numBedrooms;
}
Ce n'est pas tant un problÚme qu'une source possible de confusion. Si nous utilisons les deux méthodes, je pense que nous devrions spécifiquement noter la différence, sinon, gardez simplement la syntaxe cohérente tout au long de la section. Je pense que l'introduction des deux est probablement une bonne idée.
Juste une observation sur celui-ci, et curieux de voir quelles sont les autres opinions - mais ce défi semble tourner un peu plus autour de for...in
plutĂŽt que de hasOwnProperty
, et for...in
ne l'est pas correctement expliqué dans cette section pour le moment.
Si nous supposons que les gens ont travaillĂ© sur le reste du programme, je pense que c'est OK, car cela est au moins couvert dans la section Structures de donnĂ©es de base, mais si nous voulons que les sections soient indĂ©pendantes les unes des autres et n'exigent pas de prĂ©requis que nous voudrons peut-ĂȘtre revoir cela?
Ce défi passera avec l'une ou l'autre des solutions:
function joinDogFraternity(candidate) {
if (candidate instanceof Dog) {
return true;
}
return false;
}
// OR:
function joinDogFraternity(candidate) {
if (candidate.constructor === Dog) {
return true;
}
return false;
}
Je ne vois pas cela comme un problÚme majeur car l'instinct dicte que les gens essaieront d'abord la solution qui leur est suggérée, cependant, je peux également voir que c'est un problÚme qui se pose sur toute la ligne lorsqu'un campeur averti essaie dans les deux sens et veut faites remarquer cela.
Nous pourrions simplement ajouter un cas de test qui dit "message: 'your solution should use the constructor property'"
et vérifier avec une regex.
Ce défi, je pense, est un peu déroutant. Le titre fait référence à l'héritage, cependant, l'héritage n'est jamais mentionné dans le défi - je me rends compte qu'il est lié au prochain défi, donc les campeurs le découvriront rapidement, mais la façon dont il est présenté est encore un peu déconcertant. De plus, à la fin du défi, nous avons créé un supertype Animal
, mais nous sommes un peu confus, car Animal
, Ă ce stade, ne correspond pas Ă Cat
et Dog
. Pour apaiser un peu la confusion, je pense que nous pourrions faire un léger changement:
Cette phrase vient du prochain défi:
Ce défi et le prochain couvriront comment réutiliser les méthodes d'Animal dans Bird and Dog sans les redéfinir. Il utilise une technique appelée héritage.
Peut-ĂȘtre, pour relier les choses, un aperçu de plus haut niveau similaire Ă celui-ci peut ĂȘtre donnĂ© Ă la place dans ce dĂ©fi qui lie les 3 ensemble afin qu'il soit compris qu'il s'agit d'une sĂ©quence, et introduit en fait le concept que le dĂ©fi est intitulĂ© clairement qu'Ă la fin de ce dĂ©fi, nous n'avons pas encore terminĂ©.
ProblĂšme super mineur ici - une partie de la graine pour cela se lit comme suit:
// Add your code below this line
let duck
let beagle
duck.eat(); // Should print "nom nom nom"
beagle.eat(); // Should print "nom nom nom"
Cela génÚre une erreur de linter. Je proposerais plutÎt ce qui suit:
ProblĂšme super mineur ici - une partie de la graine pour cela se lit comme suit:
let duck; // change this line
let beagle; // change this line
duck.eat(); // Should print "nom nom nom"
beagle.eat(); // Should print "nom nom nom"
@ no-stack-dub-sack - ce sont tous d'excellents points, et je n'ai vu aucun problĂšme pour cette section bien que j'Ă©tais hors ligne une partie d'hier. Merci d'avoir parcouru cette section avec autant de dĂ©tails đ Voici mes pensĂ©es (tl; dr - je suis d'accord avec tout ce que vous avez soulevĂ©):
Use Dot Notation to Access the Properties of an Object
: les tests doivent réussir si quelqu'un utilise une instruction console.log
.Verify an Object's Constructor with instanceof
: nous devons corriger le point-virgule manquant et ĂȘtre cohĂ©rent sur la façon dont House
est défini. Bien qu'il existe plusieurs façons de faire les choses dans JS, inutile de confondre les gens qui apprennent cela pour la premiÚre fois.Understanding Own Properties
: Ă propos de votre point sur le for...in
- nous avons gĂ©nĂ©ralement considĂ©rĂ© qu'il Ă©tait acceptable d'utiliser des concepts dĂ©jĂ couverts dans le programme. Les campeurs peuvent sauter comme ils le souhaitent, mais il y a un flux vers les sujets. (Sinon, les dĂ©fis peuvent devenir longs / rĂ©pĂ©titifs s'ils doivent recouvrir les choses avant d'en arriver au but). Cela dit, je pense qu'il peut ĂȘtre utile de mettre une note juste sous l'exemple qui explique briĂšvement la syntaxe ("Rappelez-vous que for...in
fait ...)Understand the Constructor Property
: convenez de votre point Ă ajouter en utilisant le constructeur dans les instructionsUse Inheritance So You Don't Repeat Yourself
: oui, de bons points pour mieux relier les défisInherit Behaviors from a Supertype
: nous devrions certainement ajouter les points-virgules, et les commentaires sont Ă©galement utilesFaites-moi savoir si vous voulez travailler sur ceux-ci - je saute dans une autre section (je pourrais y travailler dans un jour ou deux), ou nous pourrions ouvrir cela comme de l'aide
@HKuz Cool, merci! Je vais terminer la section, ajouter quelques commentaires supplémentaires si j'en ai, puis nous pourrons décider à ce stade, mais je pense que l'ouvrir à Help Wanted sera probablement mieux. Vous tiendrons au courant.
Ce défi est légÚrement déroutant en raison du cas de test suivant:
Dog should have the bark() method as an own property.
La solution pour cette partie est Ă la recherche de ceci:
Dog.prototype.bark = function() {
console.log('Woof!');
};
et alors que Dog.prototype.hasOwnProperty('bark')
renvoie true
(donc c'est bien sûr correct), la source de la confusion vient d'ici (qui provient de Iterate Over All Properties ):
Avec les informations données aux campeurs jusqu'à présent, ils supposeraient probablement que pour réussir ce test, ils devraient définir la méthode bark
, directement sur l'instance d'objet de Dog
plutĂŽt que sur le prototype.
La distinction est que pour les instances de Dog
, bark
ne serait _pas_ une propriété own
, mais qu'elle _est_ une propriété own
de Dog.prototype
. Donc, c'est un peu déroutant pour quelqu'un qui vient de se familiariser avec ces concepts.
La solution la plus simple serait de changer le cas de test pour dire:
Dog.prototype should have the bark() method as an own property.
Cependant, une explication rapide est peut-ĂȘtre pour faire savoir aux campeurs qu'une propriĂ©tĂ© prototype
d'un prototype est en fait une propriété own
de ce prototype? Wow, c'est un virelangue, alors oui, c'est un peu déroutant, et je ne sais pas quelle est la meilleure façon de dissiper cette confusion ...
Petite faute de frappe:
Je pense que censĂ© ĂȘtre "... en dehors de la dĂ©finition de bird
". ?
Pas de problÚme majeur avec ce défi - juste une suggestion - alors que je réalise que les IIFE
anonymes sont le modĂšle le plus courant (et le modĂšle utilisĂ© dans le prochain dĂ©fi), voici peut-ĂȘtre un bon endroit pour mentionner que IIFE
peuvent Ă©galement ĂȘtre nommĂ©s, et cela pourrait mĂȘme ĂȘtre considĂ©rĂ© comme une meilleure pratique (bien que moins frĂ©quemment observĂ©e) car cela peut faciliter le dĂ©bogage car les erreurs seront plus difficiles Ă dĂ©tecter s'il y a beaucoup de IIFE
anonymes
Pensées?
J'aimerais avoir quelques rĂ©flexions sur celui-ci ... peut-ĂȘtre @dhcodes ou @Greenheart?
Mon problÚme est que je ne pense pas que le défi explique suffisamment pourquoi un IIFE
sens dans ce scénario.
La solution nécessite:
let funModule = (function() {
return {
isCuteMixin: function(obj) {
obj.isCute = function() {
return true;
};
},
singMixin: function(obj) {
obj.sing = function() {
console.log("Singing to an awesome tune");
};
}
};
})();
afin que vous puissiez faire quelque chose comme:
function Bird () { }
let duck = new Bird();
funModule.singMixin(duck);
duck.sing();
cependant, vous pouvez rĂ©aliser la mĂȘme chose d'une maniĂšre moins verbeuse et sans invoquer de fonction du tout, simplement en dĂ©finissant simplement l'objet que IIFE
retourne.
Le défi dit ceci:
L'avantage du modĂšle de module est que tous les comportements de mouvement peuvent ĂȘtre regroupĂ©s dans un seul objet qui peut ensuite ĂȘtre utilisĂ© par d'autres parties de votre code.
Mais comme cela ne nĂ©cessite pas du tout une IIFE, je suppose que je remettrais en question l'idĂ©e d'introduire le concept ici, ou de trouver un moyen plus solide de le lier. Cela pourrait ĂȘtre dĂ©routant / trompeur car les campeurs pourraient penser qu'ils DOIVENT le faire pour rĂ©aliser ce modĂšle quand ce n'est pas le cas.
Des pensées?
@ no-stack-dub-sack Je suis d'accord que ce n'est pas le meilleur exemple d'un IIFE. Serait-il préférable de fournir un module
comme exemple?
Je pense que la valeur fondamentale de l'IIFE est que vous pouvez créer des propriétés privées et des méthodes de vos objets. C'est vraiment utile pour réduire les façons dont les autres peuvent (mal) utiliser votre logiciel dans l'espoir que cela rend les choses plus fiables.
Par exemple, vous pourriez avoir un petit module utilitaire pour votre application vanilla js oĂč vous ne voulez exposer que quelques mĂ©thodes publiques puisque les autres sont sur le point d'ĂȘtre modifiĂ©es / supprimĂ©es et causeraient des problĂšmes si elles Ă©taient utilisĂ©es dans d'autres parties de la base de code.
Ce site a beaucoup de bons exemples: https://toddmotto.com/mastering-the-module-pattern/
@Greenheart Eh bien dans le dernier des 2 dĂ©fis IIFE ici, il est prĂ©sentĂ© comme un modĂšle de module, et je n'ai pas de problĂšme avec cela, je pense juste que cela pourrait ĂȘtre expliquĂ© plus clairement _pourquoi_ utiliser un IIFE, et qu'un IIFE ne doit pas nĂ©cessairement ĂȘtre prĂ©sent pour obtenir la mĂȘme fonctionnalitĂ©. Je pense que cela dit tout:
La valeur fondamentale de l'IIFE est que vous pouvez créer des propriétés privées et des méthodes de vos objets. C'est vraiment utile pour réduire les façons dont les autres peuvent (mal) utiliser votre logiciel dans l'espoir que cela rend les choses plus fiables.
Si nous pouvons simplement expliquer cela, et faire savoir Ă l'utilisateur "vous pouvez obtenir la mĂȘme fonctionnalitĂ© sans un IIFE, mais avec un IIFE est une meilleure façon, et voici pourquoi ...".
Les instructions actuelles disent:
Une expression de fonction immédiatement invoquée (IIFE) est souvent utilisée pour regrouper les fonctionnalités associées en un seul objet ou module.
Ă cela, ajoutons simplement: «Bien que la mĂȘme fonctionnalitĂ© puisse ĂȘtre obtenue sans un IIFE, la valeur fondamentale de lâIIFE, dans ce contexte, est que vous pouvez crĂ©er des propriĂ©tĂ©s privĂ©es et des mĂ©thodes de vos objets. Cela peut ĂȘtre trĂšs utile pour rĂ©duire le comment les autres peuvent (mal) utiliser votre logiciel et rendre les choses beaucoup plus fiables. "
@ no-stack-dub-sack Ceci! :pointer vers le haut:
J'ai pris la liberté de le compiler et d'apporter quelques modifications mineures. Quelque chose comme ça est ce dont nous avons besoin: rougir:
An <dfn>immediately invoked function expression</dfn> (IIFE) is often used to group related functionality into a single object or module. While the same functionality can be achieved without an IIFE, its core value in this context is that you can create private properties and methods for your objects. This can be very useful for decreasing the ways others can (mis)use your software, and make things much more reliable.
Utilisez Ă©ventuellement <dfn>
si le terme n'a pas été utilisé dans les défis précédents.
Je vais continuer et mettre à jour les tests pour utiliser la notation par points pour accéder aux propriétés d'un objet !
Poursuivant avec https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -275974706.
Le premier problÚme est que le linter ne veut pas que nous écrivions une expression qui est essentiellement du code mort (puisque nous n'appelons pas de fonction ou ne créons pas de variable). Pour résoudre ce problÚme, je suggÚre que nous attribuions le résultat à une variable.
Le deuxiĂšme et le troisiĂšme problĂšme peuvent ĂȘtre rĂ©solus en modifiant la valeur de dĂ©part pour utiliser le code que vous avez proposĂ©. L'affectation d'objets de fonction Ă des variables peut ĂȘtre enseignĂ©e ailleurs ou par expĂ©rience. Je pense que nous devrions ĂȘtre cohĂ©rents avec function X () {}
Je vais réparer ça: sourire:
Correction de https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -276268534: sourire:
Correction de https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -276565338
Je vais réparer https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -276245864
J'ai remarqué qu'aucun défi n'avait de solutions, donc je travaille actuellement sur un PR.
Les tests permettent actuellement d'utiliser la méthode intégrée Object.keys()
, mais je pense que les campeurs obtiennent une meilleure pratique en utilisant for...in
combiné avec Object.hasOwnProperty()
.
Je viens de dĂ©couvrir que ce dĂ©fi a le mĂȘme problĂšme - il permet d'utiliser Object.keys()
Comme je ne pense toujours pas que cela devrait ĂȘtre autorisĂ© dans ces dĂ©fis, je vais crĂ©er un PR en ajoutant le cas de test Ă partir de cette ligne
function Dog(name) {
this.name = name;
}
Dog.prototype.numLegs = 4;
let beagle = new Dog("Snoopy");
let ownProps = Object.keys(beagle);
let prototypeProps = Object.keys(Dog.prototype);
RĂ©soudre ce problĂšme tout de suite: sourire:
Programmation orientée objet: changer le prototype en un nouvel objet
Instructions et tests insuffisants. Est-ce que describe
et eat
existent juste sur le prototype
, ou devraient-ils ĂȘtre des fonctions?
Je pense que nous devrions ajouter des tests pour vérifier que ce sont des fonctions.
Ce défi devrait probablement formater la "propriété du constructeur" comme <code>constructor</code> property
pour augmenter la lisibilité et la cohérence. Qu'est-ce que tu penses?
Par exemple, le message de test utilise ce format.
Une suggestion générale est de remplacer les instructions let
par const
pour afficher les meilleures pratiques. Cette vidéo de @mpj l' explique bien!
Faute de frappe mineure: supertype's
devrait probablement ĂȘtre supertype
Petite faute de frappe: "Voici un exemple d'utilisation:" devrait ĂȘtre remplacĂ© par "Voici un exemple d'utilisation:"
Je travaille sur un PR pour https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -277447340
Une autre suggestion générale: je pense que nous devons changer les exemples pour que les campeurs ne puissent pas simplement copier l'exemple et changer 1-2 choses pour relever le défi.
Les exemples doivent montrer le concept, mais pas utiliser les propriĂ©tĂ©s ou les mĂ©thodes utilisĂ©es par le dĂ©fi lui-mĂȘme. De cette façon, je pense que les gens apprendront davantage de chaque dĂ©fi.
Le samedi 4 février 2017 à 21h11, Samuel Plumppu [email protected]
a Ă©crit:
Une autre suggestion générale: je pense que nous devons changer les exemples pour
les campeurs ne peuvent pas simplement copier l'exemple et changer 1-2 choses pour compléter le
défi.Les exemples doivent montrer le concept, mais pas utiliser des propriétés ou des méthodes
qui sont utilisĂ©s par le dĂ©fi lui-mĂȘme. De cette façon, je pense que les gens apprendront
plus de chaque défi.-
Vous recevez ceci parce que vous ĂȘtes abonnĂ© Ă ce fil.
RĂ©pondez directement Ă cet e-mail, affichez-le sur GitHub
https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment-277463832 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AX9USApjW3rwocbHWe2yoFLV0RegbkCCks5rZL9SgaJpZM4LxApU
.
@iansibindi Il semble que vous soyez abonné à tous les messages de ce référentiel. Pour le désactiver, visitez https://github.com/freecodecamp/freecodecamp et cliquez sur «Unwatch» en haut à droite.
Désolé pour le dérangement!
@Greenheart Je trouve qu'il est un peu difficile de suivre chacun d'entre eux mĂȘme avec les liens - je suppose que j'aurais peut-ĂȘtre dĂ» ouvrir un numĂ©ro supplĂ©mentaire pour chacun! Je voulais aussi ajouter une liste de contrĂŽle aux commentaires originaux.
Je vais commencer à faire un premier examen des PR, mais pensez-vous que vous pourriez ajouter un commentaire à chacun des commentaires originaux s'ils ont un PR ouvert pour eux afin que nous puissions suivre les problÚmes qui ont été résolus?
@ no-stack-dub-sack Haha je dois admettre que je ne peux pas le suivre moi-mĂȘme non plus, j'ai juste continuĂ© Ă poster! :sourire:
J'ajouterai un grand "PR ouvert" (avec un lien vers celui-ci) au début de chaque commentaire qui est WIP / corrigé.
@Greenheart Parfait! Merci! J'ai passé en revue les premiers PR
Je vais réparer https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -277457211
Je vais réparer https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -277459744
Je vais réparer https://github.com/freeCodeCamp/freeCodeCamp/issues/12966#issuecomment -277447340
@ no-stack-dub-sack D'accord, il reste encore quelques choses à faire ici mais j'ai résolu certaines d'entre elles aujourd'hui!
Oups, refermé: en riant:
@Greenheart Whoa! Un retour en arriÚre - y a-t-il quelque chose à faire dans celui-ci? Des améliorations majeures ont été apportées!
@ no-stack-dub-sack Je ne sais pas - il reste des choses Ă faire selon les commentaires ci-dessus, mais elles ont peut-ĂȘtre Ă©tĂ© rĂ©solues ailleurs?
Je pense que ce n'est pas encore réglé. Faites-moi savoir si vous pensez autrement
Excellent travail tout le monde. Je ferme ce numéro et nous pourrons rouvrir des problÚmes plus spécifiques à mesure qu'ils surviennent.
Commentaire le plus utile
Utilisez l'héritage pour ne pas vous répéter :
Ce défi, je pense, est un peu déroutant. Le titre fait référence à l'héritage, cependant, l'héritage n'est jamais mentionné dans le défi - je me rends compte qu'il est lié au prochain défi, donc les campeurs le découvriront rapidement, mais la façon dont il est présenté est encore un peu déconcertant. De plus, à la fin du défi, nous avons créé un supertype
Animal
, mais nous sommes un peu confus, carAnimal
, Ă ce stade, ne correspond pas ĂCat
etDog
. Pour apaiser un peu la confusion, je pense que nous pourrions faire un léger changement:Cette phrase vient du prochain défi:
Peut-ĂȘtre, pour relier les choses, un aperçu de plus haut niveau similaire Ă celui-ci peut ĂȘtre donnĂ© Ă la place dans ce dĂ©fi qui lie les 3 ensemble afin qu'il soit compris qu'il s'agit d'une sĂ©quence, et introduit en fait le concept que le dĂ©fi est intitulĂ© clairement qu'Ă la fin de ce dĂ©fi, nous n'avons pas encore terminĂ©.