6
votes

Toute ressource / didacticiels sur l'utilisation de déclarations "avec" imbriquées dans Delphi?

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 xxx

Qu'est-ce que je suis incertain de l'ordre de la priorité lors de l'utilisation de déclarations de telle manière.

Tout conseil est apprécié.


6 commentaires

Mon conseil est: évitez l'utilisation de imbriqué avec .


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


5 Réponses :


7
votes

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


6 commentaires

Pendant ce temps, une utilisation excessive de avec (et parfois n'importe quel utilise avec 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 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.



22
votes

Le meilleur conseil que je puisse vous donner est:

Ne pas utiliser avec jamais.

Si vous avez envie d'utiliser 'avec', allez vous allonger jusqu'à ce que le sentiment passe.

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.

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

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.

'avec' devrait être expulsé.


16 commentaires

@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 sur ses propres mérites, évitant ainsi le dogme et constate toujours que le jugement sort contre l'utilisation de avec ! 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 . Maintenant, le rejet du avec 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 et n'utilisent pas goto 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 besoin d'une modification sur sa syntaxe. Le meilleur point de départ (argggggghhhhhhh) est le VB.NET avec . Tous les biens et aucun des problèmes de Delphi avec .


Et oui, évitez avec 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 s'appliquent également à utilise . Mais nous sommes coincés avec celui-là. Je peux me souvenir d'utiliser à partir de 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 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); .


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 le point de savoir pourquoi avec est si mauvais. ;-)



3
votes

Delphi's avec est problématique - c'est "une sémantique imprécise" peut vraiment vous mordre à l'arrière. avec ... 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.

Edit: Dans d'autres discussions sur avec , certains ont pointé qu'une nouvelle syntaxe serait bien. Un point de départ est vb.net avec : xxx

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: xxx


5 commentaires

Nous avons déjà ce type de construction avec le sur e: exception do ...


@ François: Ouais, mais pas pour avec .


Je veux dire qu'il serait logique d'avoir la même chose pour avec comme pour exception . 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


Je suppose que je n'étais pas clair. Je suis d'accord avec votre idée parce que nous avons déjà cette syntaxe ...



2
votes

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 foo code> apparaît ici: P > xxx pré>

ce qui précède est pour toutes les intentions identiques à avec expression1, expression2 commencent ... code>. p>

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>

  • La portée de l'unité de chaque unité située dans votre utilise des clauses code>. li>
  • La section de mise en œuvre de votre propre unité (interne) li>
  • la portée de la classe (identifiants à l'intérieur de votre classe actuelle si vous écrivez une méthode) LI>
  • la procédure ou la portée de la méthode locale (section var dans une procédure ou une fonction). LI>
  • le premier avec la déclaration dans l'échantillon ci-dessus. LI>
  • la seconde avec la déclaration dans l'échantillon ci-dessus. li> ul>

    Mise à jour forte> David m'a signalé que je devrais mentionner cela au lieu de 6 "scopes" ci-dessus, nous avons vraiment 5 + x scopes, où x est la longueur de votre utilise code> clauses. 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ù 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>

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

    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> xxx pré>

    c'est mieux, beaucoup diraient que ceci: 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;
    


6 commentaires

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 au lieu de quelque.long ... ). Plus j'y pense, plus je pense que vous avez raison, Nick.


@Nickhodges: le statut réel du avec est désastriche, mais l'idée derrière elle non ... Je manque vraiment une sorte de avec en C #. Delphi est juste besoin d'une refonte dans la syntaxe.



7
votes

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];


2 commentaires

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 . Je l'utilise personnellement lorsque j'ai besoin d'instancier l'objet sans tenir sa référence (comme avec Tedit.create (auto) faire et même il pourrait y avoir un danger ...