J'essaie de prendre des poignées avec des instructions à Delphi correctement.
Dans l'ensemble, il semble assez simple de faire des choses simples avec mais je suis intéressé à trouver de bons exemples de code et / ou des tutoriels sur l'utilisation de déclarations imbriquées . Par exemple p> Qu'est-ce que je suis incertain de l'ordre de la priorité lors de l'utilisation de déclarations de telle manière. P> Tout conseil est apprécié. P > p>
5 Réponses :
Un extrait de Référence en ligne états:
Lorsque plusieurs objets ou enregistrements apparaissent après avec, l'ensemble La déclaration est traitée comme une série de déclarations imbriquées. Ainsi: p>
with obj1 do with obj2 do ... with objn do // statement
Pendant ce temps, une utilisation excessive de avec code> (et parfois n'importe quel b> utilise
avec code> même) étant fronçée sur son impact sur la lisibilité du code et le débogage des inconvénients.
@Tlama, vos postes vandalisés d'autres utilisateurs pour toutes les petites fins de vengeance. Votre profil indique-t-il à quelle fréquence vous le faites, outre ce cas enregistré? Et bien sûr, seuls vous avez des avantages publics :-) Je n'ai pas le temps d'examiner vos messages en ce moment, cependant, vous ne serez peut-être pas aussi content d'une telle invitation (à en juger de vos réponses que j'ai déjà vue).
@Tlama, Record de preuve . Veuillez lire ma remarque sur temps b> ci-dessus.
@Tlama, dis-moi pourquoi je devrais te faire confiance. Comment "bon" sont vos réponses sont un excellent exemple pourquoi? Bien sûr, je suis plus fort, vous campez dans mon profil.
@Tlama, ou quoi? Vous ferez rire de vous-même? Votre Trolling a attiré mon attention sur vos messages, je les ai examinés et ... notés. Vous rendez-vous compte de la quantité de temps précieux que j'ai passé sur cette page avec vos whinnements déjà? Je pense que vous voulez juste plus d'attention et d'arguments inactifs ailleurs ...
@Tlama, je peux seulement dire ce que votre comportement est très faux. Maintenant, perdez mon temps plus, s'il vous plaît.
Le meilleur conseil que je puisse vous donner est: p>
Si vous avez envie d'utiliser 'avec', allez vous allonger jusqu'à ce que le sentiment passe. P>
Si vous avez envie d'utiliser une personne imbriquée, battez votre main avec un marteau jusqu'à ce que le désir s'en va. p>
'with' est juste un bug qui attend pour arriver. Modification des classes utilisées avec elle peut modifier la signification de votre code. Cela crée une sémantique imprécise et c'est toujours mauvais. P>
Sauver Keystrokes n'est jamais une bonne raison d'utiliser 'avec'. Quelques coups de frappe supplémentaires vous feront maintenant beaucoup de douleur plus tard. p>
'avec' devrait être expulsé. p>
@Le_fox final sur qui va à Verity Stob: .uk / 2012/01/16 / VERITY_STOB_SONS_OF_KHAN_2011 / ...
Je suis en grande partie d'accord avec ce conseil, même si je serais probablement enclin à être moins dogmatique. Je pense que l'on peut juger chaque candidat individuel pour l'utilisation de avec code> sur ses propres mérites, évitant ainsi le dogme et constate toujours que le jugement sort contre l'utilisation de
avec code>! Il est dommage que vous n'aviez pas répondu à la question principale posée, ce qui concerne la préséance concernée du redouté dressé
avec code>. Maintenant, le rejet du
avec code> est probablement une règle que j'accepterais avec la nécessité d'utiliser le mot dogme! ;-)
Si vous n'utilisez jamais avec vous ne faites jamais une erreur en utilisant, et vous ne perdez pas de temps à envisager de l'utiliser ou non. Je ne sais pas pourquoi "dogme" dans la programmation est une mauvaise chose. Bonnes règles solides suivies est la marque de code de nettoyage. Pourquoi de telles règles sont désactivées comme "dogme" est un mystère pour moi.
Avec est le mal. Nous avons pensé à une règle d'enregistrement qui rejeter le code source contenant en tant que commandement.
@Nickhodges J'aime toujours remettre en question tout ce que je fais. Des règles difficiles comme n'utilisent pas avec code> et n'utilisent pas
goto code> gratez avec moi. Et en fait je n'utilise jamais non plus comme cela se produit!
(Je vais jouer au rôle hérétique ici) Delphi's avec code> besoin d'une modification sur sa syntaxe. Le meilleur point de départ (argggggghhhhhhh) est le VB.NET
avec code>. Tous les biens et aucun des problèmes de Delphi
avec code>.
Et oui, évitez avec code> comme la peste ... ;-)
J'ai été mordu par "avec" une fois - jamais. Dans un rétroducteur complexe, il est apparu que mon code n'était pas incapable de simplement incrémenter un entier. Après des heures de violation et d'embarrassant moi-même en publiant mon problème sur un groupe, 10 ou plus, des affiches répondent 'avec!'. Bien sûr, une propriété obscure avait le même nom que mon entier ...
Eh bien, je suppose que cela règle.
@David - Hé, ça va, mais pourquoi utiliser le mot "dogme" comme une arme? Il faut sûrement y avoir des règles de programmation que vous suivez ....
@Nickhodges arme est un peu forte. Bien sûr, je suis des règles et des directives. Mais je pense qu'ils ne devraient jamais être absolus. Il faut toujours être prêt à casser les règles s'il s'avère être un meilleur compromis à le faire. Fait intéressant, tous les arguments que vous faites concernant avec code> s'appliquent également à
utilise code>. Mais nous sommes coincés avec celui-là. Je peux me souvenir d'utiliser
à partir de code> dans modula-2 mais je ne suis pas sûr que c'était bien meilleur. Nous avons vraiment besoin d'espaces de noms décents dans OP. P.s. Avez-vous aimé le dernier versement de Verity Verity des fils de Kahn.
@David, en dehors de la curiosité: pourriez-vous donner un exemple d'utilisation de avec code> que vous trouvez acceptable ou même utile? Je l'utilise parfois comme ceci:
avec en quelque sorte.get.a.trect do canvas.ellipse (gauche, haut, droite, bas); code>.
AARGH - Bad EXEMPLE: TCanvas.ellipse a une surcharge acceptant un trect. Mais prétendez simplement que cela ne doit pas avoir le point. :-)
@Lrich Little Danger en avec Tmyform.Create (NIL) Faire comme tout le contenu d'une méthode sans variables locales. Mais personnellement, j'utilise toujours une variable locale pour tenir la référence du formulaire. Mon point n'est pas que vous devriez utiliser avec mais que vous devriez rester ouvert d'esprit.
Je n'ai aucun problème avec les règles de programmation dogmatique, tant que des directives sont fournies sur une approche alternative. Malheureusement, beaucoup d'instances que je vois que commencer avec les mots "jamais ..." semblent conclure rarement avec les mots "... et voici comment tu devrais le faire ...". L'alternative à "avec" est bien sûr de déclarer une variable locale, attribuez la valeur de la variable locale au nom d'objet à long terme, puis des méthodes d'appel sur la variable locale. par exemple. var tbl: tdataset; tbl: = tblmyrysélylongnamedtable; tbl.first; Bien que pas tbl.eof; etc.
@ULIGERHARDT: "ARGH - Bad EXEMPLE ... mais faites semblant de ne pas avoir le point". Aah mais c'est exactement i> le point de savoir pourquoi avec b> est si mauvais. ;-)
Delphi's Edit:
Dans d'autres discussions sur Je n'aime pas (une affaire de goûte) un peu, mais c'est beaucoup mieux que celui de Delphi. Une suggestion de syntaxe alternative que j'ai vue sur ces discussions est la suivante: p> avec code> est problématique - c'est "une sémantique imprécise" peut vraiment vous mordre à l'arrière.
avec code> ... OMG ... est une catastrophe en attente de se produire. Jamais besoin de la version imbriquée sur
13 ans de Delphes. Et je vais éviter pour les prochaines années.
avec code>, certains ont pointé qu'une nouvelle syntaxe serait bien. Un point de départ
est vb.net
avec code>: p>
Nous avons déjà ce type de construction avec le sur e: exception do ... code>
@ François: Ouais, mais pas pour avec code>.
Je veux dire qu'il serait logique d'avoir la même chose pour avec code> comme pour
exception code>. Nous garderions l'avantage de la portée locale (si on veut utiliser cette fonctionnalité) sans confusion ni complexité.
@ François: Euh ... Je suis d'accord avec ça, et l'exemple que j'ai donné est utilisé exactement la même syntaxe utilisée avec sur e: exception do code>
Je suppose que je n'étais pas clair. Je suis d'accord avec votre idée parce que nous avons déjà cette syntaxe ...
Je déteste même dire cela, mais il n'est pas exactement difficile de comprendre comment fonctionne des règles de portée. Dernière portée dans WINS. Toujours.
Mais les êtres humains ont ce problème, ce qui en psychologie s'appelle la théorie du morceau. Lorsque vous êtes présenté avec sept choses à garder une trace de votre esprit, on tombe, car votre cerveau compte environ 6 registres locaux pour garder les choses dans. Imaginez l'identifiant simple ce qui précède est pour toutes les intentions identiques à Voyons donc à quelle vitesse Comme la portée devient trop compliqué à suivre après un certain temps. Imaginons que nous avons les niveaux de portée suivants dans certaines applications Delphi, nous travaillons dans: P> Maintenant, le problème n'est pas l'instruction que l'on ne sait pas, c'est que les êtres humains peuvent facilement se perdre lorsque vous disposez de 6 couches de scopage lexical, comme ci-dessus, et vous exige non seulement être conscient de tous les endroits où Je pense aussi que vous pourriez dire que l'ennemi n'est pas avec, c'est la tendance Delphi Les développeurs doivent simplement continuer à développer leurs applications itérativement dans un "style rad" jusqu'à ce qu'ils soient devenus des monstruosités. Une unité qui utilise 200 autres unités est un gâchis, chacun utilise 200 d'autres unités, va vous faire plus de chagrin, même que des abus rampants de une alternative raisonnable à utiliser avec, est d'utiliser Un nom de variable simple lettre (je sais, allez-y et en désaccord) et évitez toute ambiguïté de la portée: p> c'est mieux, beaucoup diraient que ceci: p > foo code> apparaît ici: P >
avec expression1, expression2 commencent ... code>. p>
utilise des clauses code>. li>
utilise code> clauses. p>
foo code> est défini, car si vous pensiez que la première fois avec la déclaration ait quelque chose nommé
foo code> défini et il ne signifie pas Vous obtenez un bogue plutôt méchant et difficile à trouver un bogue dans votre code. Et ainsi, nous avons des personnes très intelligentes et très capables comme Nick, disant des choses très sensibles comme "N'utiliser jamais avec". Et je suis d'accord sur 99% avec Nick. P>
avec les relevés code>. P>
Avec code> n'est pas le problème entier dans le mauvais code, c'est juste l'abeille la plus courante dans le capot de Delphi Developer. Peut-être que cela devient plus d'attention que les usages trop importants-clauses, mais sur toute ma carrière, une dépendance-enfers et d'énormes articles-clauses ont fait 100 fois plus pour rendre la vie difficile, que
avec code>. Donc, je pense que
avec considéré comme nocif code> est terminé, et d'autres choses qui devraient être considérées davantage, sont considérées comme considérées. P>
procedure WithPleasure;
begin
with Some.Long.Expression[x].That.You.Dont.Want.To.Repeat.Six.Times do begin
Foo := 'test';
Bar := 'test2'
end;
end;
C ++ Auto n'est pas typing de canard. C'est statiquement typé, tout comme c # var. ITLS Type Inference. Quant à votre message, vous n'avez pas mentionné des utilisations qui apportent de nouveaux noms dans la portée et de comprendre quels noms sont apportés dans votre liste de fichiers dans votre liste d'utilisations.
Bon point David, je vais éditer et améliorer ma réponse. C'était bâclé pour dire "Début de canard" depuis que vous dites, cela compilait l'inférence de temps. Mais mon intention était de communiquer que laisser "X: tsomething" des déclarations variables locales autour de votre code crée une dépendance codée dur sur le nom de type d'expression.
Si vous avez quelque chose.Long.expression [x] .that.you.dont.want.to.repeat.six.tim es alors vous devriez refracteur en appliquant la loi de Demeter, puis vous n'aurez plus "besoin" de la avec. Sentant le besoin de "avec" est une odeur de code.
Parfois, la chose que vous souhaitez refacteur est la VCL ou une bibliothèque de tiers massive comme des composants Developer Express. Que feriez-vous alors, Nick?
Peut-être que les aides de classe aideraient. ( quelque.classhelper code> au lieu de
quelque.long ... code>). Plus j'y pense, plus je pense que vous avez raison, Nick.
@Nickhodges: le statut réel du avec code> est désastriche, mais l'idée derrière elle non ... Je manque vraiment une sorte de
avec code> en C #. Delphi est juste besoin d'une refonte dans la syntaxe.
Maintenant qu'il y a suffisamment d'opinions données, je vais essayer de répondre pleinement à votre question, bien que Cette réponse précédente répond à la Syntaxe une partie de votre question assez bien déjà. Sa référence au Documentation explique l'ordre de la priorité, ainsi que d'autres intéressants règles avec. Considérez-la comme une lecture obligatoire.
Comme vous l'avez peut-être déjà compris, le problème seul em> le problème avec code> avec code> est-ce au lieu de faire face à un membre d'instance spécifique, Vous pouvez aborder un membre de
auto code> (ou d'une instance d'un niveau imbriqué) avec le même nom, que vous n'avez évidemment pas l'intention de: P>
Left := Self.Width - W[I];
Wow, la nuit dernière, j'ai rêvé d'obtenir 800 bowvotes sur cette réponse ...;)
+1 pour aucune utilisation sûre de avec code>. Je l'utilise personnellement lorsque j'ai besoin d'instancier l'objet sans tenir sa référence (comme
avec Tedit.create (auto) faire code> et même il pourrait y avoir un danger ...
Mon conseil est: évitez l'utilisation de
imbriqué avec code>.
Ça va être amusant!
Et maintenant que j'y pense, il est difficile de croire que cette question n'est pas une troll utile. ;-)
Semblable à demander un tutoriel de se suicider.
Il est plus facile de trouver de mauvais exemples, voir: stackoverflow.com/questions/514482/... Stackoverflow.com/questions/71419/whats-wrong-with-Delphis-w Ith
@Nickhodges: Je ne crois pas que ce soit un troll, mais plus comme un "la langue permet à cela, comment puis-je l'utiliser" Type de question ... et étant donné le représentant de OP, c'est plus probable ...