Tableau facultatif vs tableau vide dans Swift
J'ai un simple Person
classe Swift qui ressemble à quelque chose comme ceci:
class Person {
var name = "John Doe"
var age = 18
var children = [Person]?
\\ init function goes here, but does not initialize children array
}
Au lieu de déclarer children
être un tableau facultatif, je pourrais simplement déclarer et initialiser un tableau vide comme ceci:
var children = [Person]()
Je suis en train de décider quelle approche est la meilleure. La déclaration du tableau comme un tableau facultatif signifie qu'il ne va pas prendre de la mémoire à tous, alors que l'un tableau vide a au moins de la mémoire allouée pour lui, correct? Donc, en utilisant le tableau optionnel signifie qu'il y aura au moins de la mémoire de l'épargne. Je suppose que ma première question est: Est-il vraiment aucune mémoire réelle économie en cause ici, ou sont mes hypothèses à propos de ce incorrect?
D'autre part, si elle est facultative, alors, chaque fois que j'essaie de l'utiliser, je vais avoir à vérifier pour voir si elle est nil
ou non avant d'ajouter ou de supprimer des objets à partir d'elle. Donc, il y aura une perte de l'efficacité de là (mais pas beaucoup, j'imagine).
J'aime bien l'option d'approche. Pas tous les Person
aura des enfants, pourquoi ne pas les laisser children
être nil
jusqu'à ce que le Person
décide de s'installer et de fonder une famille?
En tout cas, je voudrais savoir si il y a des autres avantages ou les inconvénients d'une approche ou l'autre. C'est une question de conception qui va venir encore et encore.
- Vous avez une question valable, mais je pense que les arguments pour et contre sont dangereux basé sur l'optimisation prématurée et non sémantique. Il est de loin préférable de se concentrer sur la "affordance" du code - combien il suggère l'intention (quoi que peut-être pour le contexte). Il y a un tas de choses que je n'aime pas à propos de Swift, mais pour moi, l'Option type est un véritable bijou. Il n'existe pas de "bonne" réponse à votre question, je l'utilise largement dans des contextes comme la vôtre. À l'aide d'une option pour le cas de l'option d'enfants semble tout à fait raisonnable et minimaliste.
- Je suppose que le nombre d'éléments dans la matrice de zéro signifie qu'il ya zéro des enfants. Un néant tableau voudrais suggérer qu'il existe un certain nombre d'enfants qui ne peuvent pas être égal à zéro et ne peut pas être non nulle. Il n'y a pas de logique dans le retour de néant, car il n'y a pas de sens en elle. Ayant dû maintenir le code qui a été écrit il y a 20 ans, je peux vous dire que si vous suggérer d'autres sens, en retournant néant, certains seront confus par elle et me demande ce que vous avez l'intention de faire avec ce néant qu'un tableau vide n'a pas d'accomplir. les performances du tableau vide n'est pas susceptible d'affaire.
Vous devez vous connecter pour publier un commentaire.
La possibilité de choisir entre un tableau vide ou une option qui nous donne la capacité d'appliquer l'une que de mieux décrire les données à partir d'un point de vue sémantique.
Je choisirais:
Permettez-moi de faire quelques exemples:
Remarque que mon opinion est seulement à rendre le code plus clair et de soi-même - je ne pense pas qu'il n'y a aucune différence significative en termes de performance, l'utilisation de la mémoire, etc. pour le choix de l'une ou l'autre.
Je vais faire l'inverse de Yordi - un tableau vide comme dit clairement: "cette Personne n'a pas d'enfants", et vous permettra d'économiser une tonne de tracas.
children.isEmpty
est facile de vérifier l'existence d'enfants, et vous ne jamais avoir à déballer ou de se soucier d'une inattenduenil
.Aussi, comme une note, déclarer que quelque chose comme option ne signifie pas qu'il prend zéro de l'espace - c'est le
.None
cas d'uneOptional<Array<Person>>
.Assez intéressant, nous avons récemment eu quelques discussions à propos de cette même question de la au travail.
Certains suggèrent qu'il y a de subtiles différences sémantiques. E. g.
nil
désigne une personne n'a pas d'enfants que ce soit, mais alors qu'est-ce0
veux dire? Signifie-t-il "a des enfants, l'ensemble de l'0 d'entre eux"? Comme je l'ai dit, la sémantique pure "a 0 enfants" et "n'a pas d'enfants" ne fait aucune différence lorsque l'on travaille avec ce modèle dans le code. Dans ce cas, pourquoi ne pas choisir plus straightforwards et moins de la garde-laissez-?-y approche?Certains suggèrent que le maintien d'un
nil
il y a peut être une indication que, par exemple, lors de l'extraction de modèle de backend quelque chose s'est mal passé et nous avons eu d'erreur à la place des enfants. Mais je pense que le modèle ne devrait pas essayer d'avoir ce type de sémantique et denil
ne doit pas être utilisé comme une indication d'une erreur dans le passé.Personnellement, je pense que le modèle doit être aussi stupide que possible et le plus bête option dans ce cas est vide.
Avoir une option fera de vous glisser que
?
jusqu'à la fin de jours et d'utiliserguard let
,if let
ou??
encore et encore.Vous aurez pour avoir un supplément de déballage de la logique pour
NSCoding
mise en œuvre, vous aurez à faireperson.children?.count ?? 0
au lieu de simpleperson.children.count
lors de l'affichage de ce modèle dans une vue contrôleur.Le but final de tout ce que la manipulation est d'afficher quelque chose sur l'INTERFACE utilisateur.
Voulez-vous vraiment dire
"Cette personne n'a pas d'enfants" et "Cette personne a 0 enfants" pour
nil
et tableau vide en conséquence? J'espère que vous ne serait pas 🙂Dernière Paille
Enfin, et c'est vraiment l'argument le plus fort que j'ai
subviews
propriété deUIView
: c'estvar sous-vues: [UIView] { get }
children
propriété deSKNode
: c'estvar enfants: [SKNode] { get }
Il y a des tonnes d'exemples de ce genre dans le cadre de Cacao: UIViewController::childViewControllers et plus.
Même de la pure Swift monde: De dictionnaire::touches si cela peut être un peu tiré par les cheveux.
Pourquoi est-il OK pour personne à avoir
nil
enfants, mais pas pourSKNode
? Pour moi, l'analogie est parfaite. Hey, même lesSKNode
's nom de la méthode estchildren
🙂Mon point de vue: il doit y avoir une raison évidente pour garder ces tableaux comme des options, comme une vraiment bonne, sinon tableau vide offre même de la sémantique avec moins de déballage.
La Dernière Goutte D'Eau
Enfin, des références à de très bons articles, chacun de ces
Dans Natasha post, vous trouverez une lien vers NSHipster du blog et dans Swiftification paragraphe, vous pouvez lire ceci:
nil
de sens que dans le domaine du problème. J'aurais quand même dire que si il n'y a pas besoin de modèle de la "nous ne savons pas" ou similaire, état, alors il n'y a pas besoin d'utilisernil
. E. g. dans les applications bancaires, nous (la banque) savez certainement que le client dispose de comptes, de sortenil
et tableau vide aurait même sémantique. Même avecSKNode
, leSpriteKit
cadre ne sait pour sûr si un nœud a des enfants ou non, de sorte qu'ils modèle comme tableau vide.Parfois il y a une différence entre quelque chose n'existant pas et d'être vide.
Disons que nous avons une application où l'utilisateur peut modifier une liste de numéros de téléphone et de nous enregistrer les modifications que
modifiedPhoneNumberList
. Si aucune modification n'a jamais eu lieu, le tableau doit être nul. Si l'utilisateur a modifié l'analyse des nombres en les supprimant toute la table doit être vide.Vide signifie que nous allons supprimer tous les numéros de téléphone, nul signifie que nous garder tous les numéros de téléphone actuels. La différence ici.
Quand on ne peut pas différencier entre une propriété vide ou n'existe pas ou il n'a pas d'importance vide est le chemin à parcourir. Si un
Person
devaient perdre leur seul enfant, nous devrions tout simplement à supprimer cet enfant et avoir un tableau vide plutôt que d'avoir à vérifier si lecount
est 1 puis définissez l'ensemble de la matrice denil
.J'ai toujours utiliser des tableaux vides.
À mon humble avis, l'objectif le plus important des options dans Swift est en toute sécurité enveloppez de la valeur qui peut être nul. Un tableau déjà que ce type de wrapper - vous pouvez demander au tableau s'il a quelque chose à l'intérieur & accéder à sa valeur(s) en toute sécurité avec les boucles for, cartographie, etc. Faut-il mettre une enveloppe dans une enveloppe? Je ne le pense pas.
Swift est conçu pour tirer parti de la valeur facultative et option de déballage.
Vous pourrait également déclarer le tableau en tant que néant, qu'il vous fera économiser un très faible (presque pas perceptible) quantité de mémoire.
Je voudrais aller avec une option de tableau au lieu d'un tableau qui représente une valeur nulle pour garder Swift Modèles de Conception heureuse 🙂
Je pense aussi
ressemble de plus agréable que de :