[SWIFT] 7 choses que je veux que tu gardes pour que ça ne devienne pas un putain de code

Préface

J'ai l'intention d'écrire le contenu cette fois en me concentrant sur les choses dans lesquelles même les ingénieurs avec une certaine expérience ont tendance à tomber, donc je n'ai rien écrit de super-naturel tel que [Ne pas écrire de code en double].

**2017/03/16 Il semble être souvent vu récemment, alors ajoutez-en un [Ne pas en hériter en premier lieu !!!] **

N'en héritez pas en premier lieu !!!

N'en héritez que si vous ne pouvez pas vous en empêcher. Avant cela, considérez d'autres méthodes telles que le modèle de stratégie et le modèle composite, mais seulement s'il est logique d'hériter. Fondamentalement, il est plus évolutif et le code de test est plus facile à appliquer si vous n'en héritez pas.

L'héritage est une relation

Ne le sautez pas avec "Ah, héritage. Oui, oui." Pas vraiment !!! Presque tous les ingénieurs savent ce qu'est [is-a]. Parce que c'est un concept qui apparaît dans tous les livres de pensée objet.

Cependant, d'après mon expérience, trop de gens négligent ce concept.


[Un cadre sur le site] Mr. A: "Cette classe et la méthode de cette classe sont exactement les mêmes." Mr. B: "Ah, alors si vous créez une classe parente et la mettez ensemble, vous pouvez réduire les codes en double." Moi: "C'est ridicule !!!"


C'est vrai.

Non, je pense que c'est un bon point de départ. Cependant, si [est-a], qui est le concept le plus important dans l'héritage, est omis, il est absolument inutile. [is-a] n'est ni une décoration ni un mot de débutant, c'est un concept qui devrait être utilisé dans l'implémentation. Vous pouvez créer un cours que vous ne comprenez pas parce que vous le négligez.

Mais pour être clair, [is-a] est trop abstrait et il est assez difficile de l'abandonner au niveau de la mise en œuvre, ou il y a des différences individuelles ...

Je vais donc vous présenter une méthode de jugement spécifique, donc j'espère que vous pourrez vous y référer.

"Toutes les propriétés et méthodes utilisées dans la classe parent sont-elles disponibles?"

Ne vous méprenez pas, il ne l'utilise pas, il est prêt à l'emploi. Bien sûr, vous ne pouvez pas l'utiliser, donc si vous souhaitez l'utiliser, veuillez juger s'il est prêt à être utilisé. Si cela est fait, on peut dire que c'est une relation [is-a]. Donc, d'abord, si vous voulez créer une classe enfant, voyez si elle est dans cet état.

Clarifier les entrées et sorties de la méthode

Protégez-le quand même! Si vous ne pouvez pas le garder, faites un test! (Parce que je dois le protéger) Il y a trop de méthodes avec des entrées et des sorties ambiguës. De plus, il est trop douloureux de réparer cela, je veux vraiment que vous le protégiez. Je ne peux même pas écrire un test. Sérieusement épicé Ah.

Il n'y a rien d'autre à écrire, mais veuillez en faire une méthode à laquelle on peut répondre lorsqu'on vous demande "Quelles sont les entrées et les sorties de cette méthode?"

De plus, pour être plus précis, n'effectuez pas le traitement suivant avec une seule méthode. [J'ai fait un calcul → enregistrer le résultat du calcul] Cela signifie renvoyer le résultat du calcul et le sauvegarder à l'appelant.

S'il y a un départ, il y a aussi un arrêt

Ceci est également assez courant. Pourquoi ne s'arrête-t-il pas même s'il a commencé?

Il ne s'agit pas seulement de démarrer et d'arrêter, mais il existe des méthodes qui devraient être associées. N'y a-t-il pas une classe qui commence par le constructeur de l'instance et s'arrête de l'extérieur?

Rendez votre code cohérent de toute façon.

Étroit, fort et doux

La plage de divulgation est étroite, les restrictions sont fortes et je veux être gentil Rendre toutes les méthodes Kaku privées. Après cela, veuillez publier uniquement ce dont vous avez besoin. Il est vraiment difficile de voir si vous publiez quelque chose qui n'est utilisé que dans la classe. La propriété est en lecture seule et si elle ne fonctionne toujours pas, écrivez-la.

Toutes les variables sont également const et les arguments de méthode sont également const. Limitez tout ce qui peut être restreint.

Le rappel ne se mêle pas à la logique.

N'appelez pas le rappel dans une méthode qui contient une certaine logique.

C'est à ce moment que vous renvoyez le rappel à l'appelant. Cela signifie que la partie renvoyée de l'enfant au parent n'est pas liée à la logique.

(Tweet) Quel était le nom du code qui n'a pas écrit la logique et qui a simplement passé la valeur? J'avais un nom, mais je l'ai oublié, alors écrivez-le dans les commentaires si vous le comprenez.

**2017/03/16 J'ai demandé à Hatebu d'écrire quelque chose comme «Je ne sais pas», alors quand je l'ai examiné, j'ai pensé «C'est vrai», alors je l'ai ajouté ci-dessous. J'étais tellement en colère à ce moment-là que j'ai beaucoup écrit www **

Par exemple Supposons que vous ayez le calcul 1, le calcul 2 et le calcul 3. Supposons que vous souhaitiez renvoyer "Calcul 1 + Calcul 2 + Calcul 3" dans le rappel. Faites-le en une seule méthode

//Puisqu'il s'agit d'un rappel, il est renvoyé de manière asynchrone.
Tous les résultats de calcul{
return [Calcul 1+Calcul 2+Calcul 3]
}

ne pas

Résultat du calcul 1{
calcul de retour 1
}

Résultat du calcul 2{
calcul de retour 2
}

Résultat du calcul 3{
calcul de retour 3
}

//Puisqu'il s'agit d'un rappel, il est renvoyé de manière asynchrone.
Tous les résultats de calcul{
  return [Résultat du calcul 1+Résultat du calcul 2+Résultat du calcul 3]
}

Cela signifie écrire.

Pourquoi demandes-tu? S'agit-il de celui qui est le plus facile à écrire du code de test? Les rappels sont asynchrones, il est donc difficile de tester avec la logique, non?

La référence mutuelle est absolument inutile

Je suis épuisé, comme il est écrit. Dans le code que j'ai vu, l'instance parent dans la relation [has-a] était un singleton, et l'instance enfant se plongeait dans les propriétés de l'instance parent qu'elle avait dans le singleton.

Il n'est pas nécessaire d'avoir une propriété qui référence directement le parent. Ceci est une référence mutuelle

N'essayez pas d'écrire des commentaires proprement. Mettez vos pensées dedans! !! !!

Il y avait quelque chose comme ça dans le commentaire que j'ai vu l'autre jour.

//Exécuter sur le fil principal

Voyant cela, j'ai murmuré, "Pourquoi?" En un mot

Ne laissez pas un commentaire qui demande "pourquoi?" !!

à propos de ça.

Voici un bon exemple de ce commentaire.

//Appelé par le thread principal car il y a un traitement de dessin à la destination de l'appel.

Voici un exemple de commentaire avec réflexion

//Je ne suis pas sûr, mais quand je l'ai appelé dans le fil principal, il ne s'est plus écrasé.

En regardant ce commentaire, vous pouvez ressentir le niveau de l'ingénieur et comprendre qu'il est normal de le corriger, donc quiconque connaît la cause peut la corriger.

Pourquoi ne voyez-vous pas à nouveau les commentaires suivants?

//Exécuter sur le fil principal

Vous ne pouvez rien faire si vous ne savez pas pourquoi. Si cela se produit, les commentaires augmenteront la quantité de code que vous ne comprenez pas.

Postscript 16 août 2016 J'ai reçu un commentaire que j'ai écrit d'une personne sur le site précédent qui a vu ce message, donc je vais le présenter ici w

# koitaro 2015/09/14
# Thread.current[:request]En plongeant l'url dans et si elle contient une étape
#Le jugement est divisé, mais comme il s'agit d'une variable dite globale, il n'est pas bon de l'écrire comme ça
#Par conséquent, j'ai essayé de le refactoriser d'une manière ou d'une autre, mais il est profondément imbriqué et utilisé.
#Par conséquent, j'ai abandonné parce que je ne pouvais pas l'améliorer facilement.
#Attends le jour où le héros apparaît

Recommended Posts

7 choses que je veux que tu gardes pour que ça ne devienne pas un putain de code
Une collection de modèles dont vous voulez être conscient pour ne pas compliquer le code
Une interface fluide? -Je veux vous donner l'occasion d'écrire du bon code. 3 [Exemple de refactoring C #]
Je souhaite utiliser le balayage arrière sur un écran qui utilise XLPagerTabStrip
L'histoire de Collectors.groupingBy que je veux garder pour la postérité
Est-il possible de séparer les appels de fonction et les branches conditionnelles? - Je veux vous donner une chance d'écrire du bon code. 9 [Exemple de refactoring C #]
Java avait une bibliothèque de création de code QR appelée QRGen qui enveloppe bien ZXing, alors je l'ai essayé
Liste de réglages de Glassfish que je souhaite conserver pour le moment
Je voudrais résumer Apache Wicket 8 car c'est une bonne idée
Je souhaite développer une application web!
Je veux écrire un joli build.gradle
Je veux écrire un test unitaire!
[Android] Je souhaite créer un ViewPager pouvant être utilisé pour les didacticiels
Je veux écrire une simple répétition d'une chaîne de caractères
Je souhaite concevoir une structure pour la gestion des exceptions
[MyBatis] Je souhaite mapper une requête de requête à une table qui a une relation un-à-plusieurs avec un bean imbriqué.
Je souhaite utiliser PowerMock dans une classe qui combine des tests paramétrés et des tests ordinaires
Je souhaite l'implémenter en plus lors de l'utilisation de kotlin sur un site exécutant Java
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
Je veux appeler une méthode d'une autre classe
Je veux utiliser NetBeans sur Mac → Je peux l'utiliser!
Choses à vérifier lorsque vous ne travaillez pas avec proguard
Je veux utiliser une petite icône dans Rails
Je souhaite surveiller un fichier spécifique avec WatchService
Je souhaite définir une fonction dans la console Rails
firewalld est devenu fou, alors j'ai réussi à le réparer
Je veux cliquer sur une broche GoogleMap dans RSpec
Je souhaite créer une annotation générique pour un type
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
Easy Null Check-Je veux vous donner une chance d'écrire du bon code. 6 [Exemple de refactoring C #]
Une petite collection de code inquiétante - je veux vous donner une chance d'écrire du bon code. 2 [Exemple de refactoring C #]
Branchement conditionnel compliqué - je veux vous donner une chance d'écrire du bon code. 1 [Exemple de refactoring C #]
Gestion des types booléens - Je veux vous donner une chance d'écrire du bon code. 7 [Exemple de refactoring C #]
[Docker] Est-il suffisant de l'appeler une construction en plusieurs étapes? → L'histoire qui est devenue si bonne
J'ai été inspiré par l'article destiné aux nouveaux arrivants, alors prenez-en note pour ne pas oublier votre intention initiale