{"id":51,"date":"2020-12-28T19:20:15","date_gmt":"2020-12-28T18:20:15","guid":{"rendered":"http:\/\/192.168.178.38\/?p=51"},"modified":"2020-12-28T19:20:15","modified_gmt":"2020-12-28T18:20:15","slug":"antipattern","status":"publish","type":"post","link":"https:\/\/lpl-mind.de\/en\/antipattern\/","title":{"rendered":"Antipattern"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-52\" src=\"http:\/\/192.168.178.38\/wp-content\/uploads\/2020\/12\/sebastian-herrmann-jztqvxcykys-unsplash-300x149.jpg\" alt=\"\" width=\"300\" height=\"149\" srcset=\"https:\/\/lpl-mind.de\/wp-content\/uploads\/2020\/12\/sebastian-herrmann-jztqvxcykys-unsplash-300x149.jpg 300w, https:\/\/lpl-mind.de\/wp-content\/uploads\/2020\/12\/sebastian-herrmann-jztqvxcykys-unsplash-768x383.jpg 768w, https:\/\/lpl-mind.de\/wp-content\/uploads\/2020\/12\/sebastian-herrmann-jztqvxcykys-unsplash.jpg 863w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><br \/>\nHeute einmal mit einem Antipattern, zum Thema tostring Methode. Viele kennen es und in vielen Programmiersprachen wird es unterst\u00fctzt, die &#8220;.ToString()&#8221; Methode. Geliebt und oft und genutzt, doch es gibt einige Probleme bei der Nutzung der ToString() Methode. Die folgenden Beispiele sind in C# geschrieben, sind allerdings 1 zu 1 anwendbar in jeder weiteren Programmiersprache. Ich werde zun\u00e4chst einige Beispiele auflisten, die zeigen sollen wie die ToString() Methode nicht genutzt werden sollte.<br \/>\n<strong>Beispiel 1: ToString als Konverter<\/strong><\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:700px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/><\/div><\/td><td><div class=\"csharp codecolorer\"><span class=\"kw4\">class<\/span> Person <span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Name <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> Age <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw1\">override<\/span> <span class=\"kw4\">string<\/span> ToString<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> JsonConvert<span class=\"sy0\">.<\/span><span class=\"me1\">SerializeObject<\/span><span class=\"br0\">&#40;<\/span><span class=\"kw1\">this<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span> <br \/>\n<span class=\"br0\">&#125;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>In diesem Beispiel, wird die ToString() Methode als Json Serializer genutzt. Im weiterem verlauf wurde dieses Json persistiert. Und bei Bedarf wieder Deserialisiert (JsonConvert.DeserializeObject(jsonstring);). Auf dem erstem Blick spricht da auch nicht viel dagegen, sofern das gesamtes Dev Team nach dieser Konvention arbeiten m\u00f6chte. Allerdings zeigt die Realit\u00e4t dass diese Verwendung zu Problemen f\u00fchren wird. Sobald eine neue Klasse erstellt wird und der Entwickler nicht die ToString() Methode laut Konvention richtig f\u00fcllt. In diesem Falle w\u00fcrde die default ToString Methode greifen, welche den Klassen Namen und die Version ausgibt. Bei der Deserialisierung kommt es dann zum b\u00f6sen Erwachen. Die Daten k\u00f6nnen nicht rekonstruiert werden.<br \/>\nF\u00fcr diesen Fall sollte immer das passende Converter geschrieben werden, sofern eine automatische Konvertierung nicht m\u00f6glich ist. Siehe &#8220;Newtonsoft.Json.JsonConverter&#8221;<br \/>\nB<strong>eispiel 2: ToString als GUI Ausgabe<\/strong><\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:700px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/><\/div><\/td><td><div class=\"csharp codecolorer\"><span class=\"kw4\">class<\/span> Person <span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Name <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> Age <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw1\">override<\/span> <span class=\"kw4\">string<\/span> ToString<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#123;<\/span> <br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;Person: &quot;<\/span> <span class=\"sy0\">+<\/span> Name <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot; ist &quot;<\/span> <span class=\"sy0\">+<\/span> Age<span class=\"sy0\">+<\/span> <span class=\"st0\">&quot; Jahre alt.&quot;<\/span><span class=\"sy0\">;<\/span> <br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span> <br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"sy0\">....<\/span> <br \/>\n<span class=\"me1\">currentPersonLabel<\/span><span class=\"sy0\">.<\/span><span class=\"me1\">Text<\/span> <span class=\"sy0\">=<\/span> person<span class=\"sy0\">;<\/span> <br \/>\n<span class=\"sy0\">....<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Im diesem Beispiel wird die ToString Methode als GUI Hilfsklasse missbraucht. Hier wurde der zu anzeigende Text direkt in die ToString Methode geschrieben. Davon abgesehen das keine Ressourcen genutzt wurden, wird f\u00fcr einen einzigen GUI fall der Text statisch vorgegeben. Sobald die Person noch in weiteren GUI Elementen vorkommen soll, wird es schwierig. Zus\u00e4tzlich ist nicht jedem Entwickler klar, dass eine \u00c4nderung des Textes in der ToString Methode eine Auswirkung auf GUI Element haben wird.<br \/>\nAuch hier ganz klar, sollte die ToString Methode nicht verwendet werden. Ein direkt Zugriff auf die Variablen wird wahrscheinlich schon ausreichen.<br \/>\n<strong>Beispiel 3: ToString zum Vergleichen<\/strong><\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:700px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/>6<br \/>7<br \/>8<br \/>9<br \/>10<br \/>11<br \/>12<br \/><\/div><\/td><td><div class=\"csharp codecolorer\"><span class=\"kw4\">class<\/span> Person <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">string<\/span> Name <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw4\">int<\/span> Age <span class=\"br0\">&#123;<\/span> <span class=\"kw1\">get<\/span><span class=\"sy0\">;<\/span> <span class=\"kw1\">set<\/span><span class=\"sy0\">;<\/span> <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw1\">override<\/span> <span class=\"kw4\">string<\/span> ToString<span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; <span class=\"kw1\">return<\/span> <span class=\"st0\">&quot;Person: &quot;<\/span> <span class=\"sy0\">+<\/span> Name <span class=\"sy0\">+<\/span> <span class=\"st0\">&quot; &quot;<\/span> <span class=\"sy0\">+<\/span> Age<span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"br0\">&#125;<\/span><br \/>\n<br \/>\n<span class=\"br0\">&#125;<\/span><br \/>\n<span class=\"sy0\">....<\/span> <br \/>\n<span class=\"kw1\">if<\/span> <span class=\"br0\">&#40;<\/span>person1<span class=\"sy0\">.<\/span><span class=\"me1\">ToString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">==<\/span>person2<span class=\"sy0\">.<\/span><span class=\"me1\">ToString<\/span><span class=\"br0\">&#40;<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#41;<\/span> <br \/>\n<span class=\"sy0\">....<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>Im dem letztem Beispiel wird die ToString Methode zum Vergleichen genutzt. Auch hier w\u00fcrde es zun\u00e4chst funktionieren. Allerdings m\u00fcsste die ToString Methode immer gepflegt werden. Sobald ein Property hinzukommt muss dies auch in der ToString Methode aufgelistet werden, ansonsten ist der Vergleich nicht korrekt. Der richtige Weg w\u00e4re hier das \u00fcberschreiben der compare Methode.<\/p>\n<div class=\"codecolorer-container csharp default\" style=\"overflow:auto;white-space:nowrap;width:700px;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/><\/div><\/td><td><div class=\"csharp codecolorer\">&nbsp;<span class=\"kw1\">public<\/span> <span class=\"kw1\">virtual<\/span> <span class=\"kw4\">bool<\/span> Equals <span class=\"br0\">&#40;<\/span><span class=\"kw4\">object<\/span> obj<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n<p>In Zuge dessen habe ich mich auf der Suche gemacht und einige Definitionen rausgesucht.<br \/>\nF\u00fcr Java findet man auf &#8220;https:\/\/www.javatpoint.com\/understanding-toString()-method&#8221; folgende Beschreibung:<\/p>\n<blockquote><p>If you want to represent any object as a string, toString() method comes into existence.<br \/>\nThe toString() method returns the string representation of the object.<br \/>\nIf you print any object, java compiler internally invokes the toString() method on the object. So overriding the toString() method, returns the desired output, it can be the state of an object etc. depends on your implementation.<\/p><\/blockquote>\n<p>Nat\u00fcrlich kann dies von einem oder dem andrem missverstanden werden. Speziell die \u00e4u\u00dferung &#8220;If you want to represent any object as a string&#8221; verleitet wohl den ein oder anderen, diese Methode f\u00fcr alles M\u00f6gliche zu verwenden. Besser w\u00e4re es gewesen die Aussage &#8220;If you print any object, java compiler internally invokes&#8221; hervorzuheben.<br \/>\n\u00c4hnliches gilt f\u00fcr Microsoft (c#) &#8220;https:\/\/docs.microsoft.com\/en-us\/dotnet\/api\/system.object.tostring?view=netframework-4.8&#8221;<\/p>\n<blockquote><p>Object.ToString is the major formatting method in the .NET Framework. It converts an object to its string representation so that it is suitable for display. (For information about formatting support in the .NET Framework, see Formatting Types.) Default implementations of the Object.ToString method return the fully qualified name of the object\\&#8217;s type.<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Heute einmal mit einem Antipattern, zum Thema tostring Methode. Viele kennen es und in vielen Programmiersprachen wird es unterst\u00fctzt, die &#8220;.ToString()&#8221; Methode. Geliebt und oft und genutzt, doch es gibt einige Probleme bei der Nutzung der ToString() Methode. Die folgenden Beispiele sind in C# geschrieben, sind allerdings 1 zu 1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-51","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/posts\/51"}],"collection":[{"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/comments?post=51"}],"version-history":[{"count":5,"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/posts\/51\/revisions"}],"predecessor-version":[{"id":57,"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/posts\/51\/revisions\/57"}],"wp:attachment":[{"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/media?parent=51"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/categories?post=51"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lpl-mind.de\/en\/wp-json\/wp\/v2\/tags?post=51"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}