Freecodecamp: [beta] ContrÎle qualité de la section de programmation orientée objet

CrĂ©Ă© le 30 janv. 2017  Â·  44Commentaires  Â·  Source: freeCodeCamp/freeCodeCamp

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 !!

Commentaires / problÚmes généraux:

  • Il semble que dans cette section, une fois que vous avez rĂ©solu un dĂ©fi, vous pouvez modifier ou mĂȘme effacer le code, et le dĂ©fi passera toujours. J'ai crĂ©Ă© un problĂšme distinct pour ceci: # 13021
  • Ce serait bien de faire enregistrer les sorties sur la console de dĂ©fi intĂ©grĂ©e afin que les gens puissent voir les rĂ©sultats de leur code. Nous appelons souvent des mĂ©thodes qui consignent des choses sur la console dans ces dĂ©fis, mais elles ne sont pas conçues pour se connecter Ă  la console sur la page.

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, 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Ă©.

Tous les 44 commentaires

Utiliser la notation par points pour accéder aux propriétés d'un objet

(RÉSOLU EN STAGING) ✅

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?

VĂ©rifiez le constructeur d'un objet avec instanceof :

(RÉSOLU EN STAGING) ✅

  • Pour une raison quelconque, le linter lance l'avertissement 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.
  • En outre, le code de dĂ©part lui-mĂȘme a un avertissement linter lors du chargement pour un point-virgule manquant.
  • Enfin sur celui-ci, je ne sais pas si c'est intentionnel, mais cela peut ĂȘtre un peu dĂ©routant - dans les dĂ©fis prĂ©cĂ©dents de cette section, les constructeurs sont dĂ©finis comme ceci:
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.

Comprendre ses propres propriétés :

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?

Comprendre la propriété du constructeur :

(RÉSOLU EN STAGING) ✅

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.

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, 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Ă©.

HĂ©riter des comportements d'un supertype :

(RÉSOLU EN STAGING) ✅

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 instructions
  • Use Inheritance So You Don't Repeat Yourself : oui, de bons points pour mieux relier les dĂ©fis
  • Inherit Behaviors from a Supertype : nous devrions certainement ajouter les points-virgules, et les commentaires sont Ă©galement utiles

Faites-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.

Ajouter des méthodes aprÚs l'héritage :

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 ):
image

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 ...

Utilisez la fermeture pour protéger les propriétés d'un objet contre toute modification externe :

(RÉSOLU EN STAGING) ✅

Petite faute de frappe:

image

Je pense que censĂ© ĂȘtre "... en dehors de la dĂ©finition de bird ". ?

Comprendre l'expression de fonction immédiatement appelée (IIFE) :

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?

Utilisez un IIFE pour créer un module :

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:

J'ai remarqué qu'aucun défi n'avait de solutions, donc je travaille actuellement sur un PR.

Comprendre ses propres propriétés :

(RÉSOLU EN STAGING) ✅

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() .

Programmation orientée objet: itérer sur toutes les propriétés :

(RÉSOLU EN STAGING) ✅

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.

Programmation orientée objet: n'oubliez pas de définir la propriété du constructeur lors du changement de prototype

PR soumis: white_check_mark:

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!

Programmation orientée objet: réinitialisation d'une propriété de constructeur héritée :

PR soumis: white_check_mark:

Faute de frappe mineure: supertype's devrait probablement ĂȘtre supertype

Programmation orientée objet: utilisez un IIFE pour créer un module :

PR soumis: white_check_mark:

Petite faute de frappe: "Voici un exemple d'utilisation:" devrait ĂȘtre remplacĂ© par "Voici un exemple d'utilisation:"

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.

Ditch Custom CSS pour Bootstrap

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

@ 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.

Cette page vous a été utile?
0 / 5 - 0 notes