Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Example: Why does .NET promote bad programming practices?

Example: Why does .NET promote bad programming practices?

Scheduled Pinned Locked Moved The Lounge
questioncsharpcomhelptutorial
43 Posts 25 Posters 1 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Marc Clifton

    OK, this is a more language specific post, but the VB thread below got me thinking (a bad thing, I know). For example, being able to do:

    switch(myString)
    {
    case "Hello":
    ...
    case "Goodbye":
    ...
    }

    is a perfect example of how the language promotes bad programming. The result is a case-sensitive, culture-specific, difficult to extend, and probably format specific within the context of the whole parser, implementation. Now, I personally don't feel a language should (or even can) enforce good programming practices. But a language that supports a bad practice certainly doesn't help the situation. Anyone want to contribute other examples or thoughts? Marc

    Thyme In The Country

    People are just notoriously impossible. --DavidCrow
    There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
    People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

    J Offline
    J Offline
    jpg 0
    wrote on last edited by
    #25

    Since strings in .NET are unicode, the string "Hello" is basically a byte[10] array with fixed, compile-time known value. This is not a language issue or compiler issue at all because instead of 'case 0: case 1: case 234:', you have a string representative of the underlying values, which is much more readable. In terms of case-sensitive and culture issue, it really depends on where the given string comes from and what does it represent. For instance, in a localized app, regardless of the culture, you will need a culture-unspecific id to identify a control/component. That id could be a GUID, an integer, or a string. From your code sample, I will presume that the given 'myString' is properly normalized with correct cap and trimming. If this isn't the case, then it is the programmer's problem, never the tool.

    1 Reply Last reply
    0
    • M Marc Clifton

      OK, this is a more language specific post, but the VB thread below got me thinking (a bad thing, I know). For example, being able to do:

      switch(myString)
      {
      case "Hello":
      ...
      case "Goodbye":
      ...
      }

      is a perfect example of how the language promotes bad programming. The result is a case-sensitive, culture-specific, difficult to extend, and probably format specific within the context of the whole parser, implementation. Now, I personally don't feel a language should (or even can) enforce good programming practices. But a language that supports a bad practice certainly doesn't help the situation. Anyone want to contribute other examples or thoughts? Marc

      Thyme In The Country

      People are just notoriously impossible. --DavidCrow
      There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
      People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

      T Offline
      T Offline
      Tomas Petricek
      wrote on last edited by
      #26

      It is very difficult to find the ballance between enforcing good practices and giving developers more control. The example you posted can be dangerous, but it is perfectly correct in certain situations (as Rocky Moore mentioned). Interesting extension to the swith control structure are Active patterns available in F#: http://blogs.msdn.com/dsyme/archive/2006/08/16/ActivePatterns.aspx[^]. In simple words, active patterns make it is possible to write patterns (rules) that are executed when "case" statement is reached. This rule can than decide whether case statement should be executed. Of course this can be misused, but I think that it would be interesting extension to main-stream programming languages.

      // You could then use something like this..:
      switch(str)
      {
      case CaseSensitiveMatch("something"):
      ... break;
      case CaseInsensitiveMatch("SomeThinG"):
      ... break;
      case CaseInsensitiveContains("thing"):
      ... break;
      }

      Actually working with strings directly is always potential source of problems (with localization), but I think that active patterns could be useful in many other sitations.

      Homepage: TomasP.net | Photo of the month: Calendar | C# and LINQ, F#, Phalanger: My Blog
      Latest article: Phalanger, PHP for .NET: Introduction for .NET developers

      1 Reply Last reply
      0
      • D DavidNohejl

        Interesting, this is what my Reflector shows: private static bool TryStringToNumber(string str, NumberStyles options, ref Number.NumberBuffer number, NumberFormatInfo numfmt, bool parseDecimal);

          if (!Number.ParseNumber(ref chPtr2, options, ref number, numfmt, parseDecimal) 
                || ((((long) ((chPtr2 - chPtr1) / 2)) < str.Length)
                && !Number.TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr1) / 2)))))
                    {
                          return false;
                    }
        

        private static void StringToNumber(string str, NumberStyles options, ref Number.NumberBuffer number, NumberFormatInfo info, bool parseDecimal);

              if (!Number.ParseNumber(ref chPtr2, options, ref number, info, parseDecimal) 
               || ((((long) ((chPtr2 - chPtr1) / 2)) < str.Length) 
               && !Number.TrailingZeros(str, (int) ((long) ((chPtr2 - chPtr1) / 2)))))
                    {
                          throw new FormatException(Environment.GetResourceString("Format_InvalidString"));
                    }
        

        "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus

        E Offline
        E Offline
        Ed Poore
        wrote on last edited by
        #27

        Hmm, must have been mistaken then, where did I see that code then... :suss:

        T D 2 Replies Last reply
        0
        • E Ed Poore

          Hmm, must have been mistaken then, where did I see that code then... :suss:

          T Offline
          T Offline
          tgrt
          wrote on last edited by
          #28

          I remember seeing it in Reflector too, so don't feel bad. Maybe it changed with SP1?

          E 1 Reply Last reply
          0
          • P Paul Watson

            'cause it is useful when you need it to get a quick job done. There is a lot to be said about premature optimisation and astronaut architects.

            regards, Paul Watson Ireland & South Africa

            Shog9 wrote:

            And with that, Paul closed his browser, sipped his herbal tea, fixed the flower in his hair, and smiled brightly at the multitude of cute, furry animals flocking around the grassy hillside where he sat coding Ruby on his Mac...

            S Offline
            S Offline
            Stuart Dootson
            wrote on last edited by
            #29

            And then the "quick job" gets used a lot and built upon and (before you know it) that quick hack is the corner stone of a dreadful big monolithic application...

            P 1 Reply Last reply
            0
            • D DavidNohejl

              Phrase "astronaut architects" is not known to be, but I think I agree :) Using TryParse when dealing with user input is usually sufficient. If TryParse methods are not fast enough, by all means implement yours. edit: oops, didn't see you responded to original post and not TryParse debate above. Well, surprisingly my post didn't lost its meaning. :->


              "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus

              P Offline
              P Offline
              Paul Watson
              wrote on last edited by
              #30

              I first heard about it from Joel[^].

              regards, Paul Watson Ireland & South Africa

              Shog9 wrote:

              And with that, Paul closed his browser, sipped his herbal tea, fixed the flower in his hair, and smiled brightly at the multitude of cute, furry animals flocking around the grassy hillside where he sat coding Ruby on his Mac...

              1 Reply Last reply
              0
              • M Marc Clifton

                OK, this is a more language specific post, but the VB thread below got me thinking (a bad thing, I know). For example, being able to do:

                switch(myString)
                {
                case "Hello":
                ...
                case "Goodbye":
                ...
                }

                is a perfect example of how the language promotes bad programming. The result is a case-sensitive, culture-specific, difficult to extend, and probably format specific within the context of the whole parser, implementation. Now, I personally don't feel a language should (or even can) enforce good programming practices. But a language that supports a bad practice certainly doesn't help the situation. Anyone want to contribute other examples or thoughts? Marc

                Thyme In The Country

                People are just notoriously impossible. --DavidCrow
                There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
                People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

                P Offline
                P Offline
                PIEBALDconsult
                wrote on last edited by
                #31

                Switching on strings is a good feature, but to be used sparingly. Many years ago I had need of reading in some reports and processing the data, having only Vax-C as a tool. I found that because a character constant could actually hold two characters I could switch on the first two characters of each line, something like:

                FILE* file ;
                char* buffer ;
                char firsttwocharacters ;

                ...

                readaline ( file , buffer ) ;

                firsttwocharacters = *buffer ;

                switch ( firsttwocharacters )
                {
                case 'AB' : ...
                case 'CD' : ...
                ...
                }
                ...

                And I don't use TryParse, I've read articles like this one: http://www.codeproject.com/dotnet/ExceptionPerformance.asp[^]

                1 Reply Last reply
                0
                • M Marc Clifton

                  OK, this is a more language specific post, but the VB thread below got me thinking (a bad thing, I know). For example, being able to do:

                  switch(myString)
                  {
                  case "Hello":
                  ...
                  case "Goodbye":
                  ...
                  }

                  is a perfect example of how the language promotes bad programming. The result is a case-sensitive, culture-specific, difficult to extend, and probably format specific within the context of the whole parser, implementation. Now, I personally don't feel a language should (or even can) enforce good programming practices. But a language that supports a bad practice certainly doesn't help the situation. Anyone want to contribute other examples or thoughts? Marc

                  Thyme In The Country

                  People are just notoriously impossible. --DavidCrow
                  There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
                  People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

                  P Offline
                  P Offline
                  Paul Brower
                  wrote on last edited by
                  #32

                  First thing one learns in a Test Driven Development environment is: switch statements = bad bad bad.

                  M 1 Reply Last reply
                  0
                  • E Ed Poore

                    Hmm, must have been mistaken then, where did I see that code then... :suss:

                    D Offline
                    D Offline
                    Dan Neely
                    wrote on last edited by
                    #33

                    I don't have VS05, what's inside Number.ParseNumber?

                    -- Rules of thumb should not be taken for the whole hand.

                    D 1 Reply Last reply
                    0
                    • S Stuart Dootson

                      And then the "quick job" gets used a lot and built upon and (before you know it) that quick hack is the corner stone of a dreadful big monolithic application...

                      P Offline
                      P Offline
                      Paul Watson
                      wrote on last edited by
                      #34

                      Well obviously that shouldn't happen. People just need to use their heads :)

                      regards, Paul Watson Ireland & South Africa

                      Shog9 wrote:

                      And with that, Paul closed his browser, sipped his herbal tea, fixed the flower in his hair, and smiled brightly at the multitude of cute, furry animals flocking around the grassy hillside where he sat coding Ruby on his Mac...

                      1 Reply Last reply
                      0
                      • P Paul Watson

                        'cause it is useful when you need it to get a quick job done. There is a lot to be said about premature optimisation and astronaut architects.

                        regards, Paul Watson Ireland & South Africa

                        Shog9 wrote:

                        And with that, Paul closed his browser, sipped his herbal tea, fixed the flower in his hair, and smiled brightly at the multitude of cute, furry animals flocking around the grassy hillside where he sat coding Ruby on his Mac...

                        C Offline
                        C Offline
                        Chris Maunder
                        wrote on last edited by
                        #35

                        Paul Watson wrote:

                        premature optimisation

                        You can get medication for that these days.

                        cheers, Chris Maunder

                        CodeProject.com : C++ MVP

                        P 1 Reply Last reply
                        0
                        • C Chris Maunder

                          Paul Watson wrote:

                          premature optimisation

                          You can get medication for that these days.

                          cheers, Chris Maunder

                          CodeProject.com : C++ MVP

                          P Offline
                          P Offline
                          Paul Watson
                          wrote on last edited by
                          #36

                          Sadly it can make you go blind.

                          regards, Paul Watson Ireland & South Africa

                          Shog9 wrote:

                          And with that, Paul closed his browser, sipped his herbal tea, fixed the flower in his hair, and smiled brightly at the multitude of cute, furry animals flocking around the grassy hillside where he sat coding Ruby on his Mac...

                          1 Reply Last reply
                          0
                          • D Dan Neely

                            I don't have VS05, what's inside Number.ParseNumber?

                            -- Rules of thumb should not be taken for the whole hand.

                            D Offline
                            D Offline
                            DavidNohejl
                            wrote on last edited by
                            #37

                            You don't need VS2005, but Reflector[^] and .NET framework assemblies, obviously. Well, in Number.ParseNumber is lot of code, but no exception throwing.


                            "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus

                            D 1 Reply Last reply
                            0
                            • D DavidNohejl

                              You don't need VS2005, but Reflector[^] and .NET framework assemblies, obviously. Well, in Number.ParseNumber is lot of code, but no exception throwing.


                              "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus

                              D Offline
                              D Offline
                              Dan Neely
                              wrote on last edited by
                              #38

                              True, but since I'm only doing 1.1 dev work, I don't have, or need, the 2.0 framework installed.

                              -- Rules of thumb should not be taken for the whole hand.

                              1 Reply Last reply
                              0
                              • P Paul Brower

                                First thing one learns in a Test Driven Development environment is: switch statements = bad bad bad.

                                M Offline
                                M Offline
                                Marc Clifton
                                wrote on last edited by
                                #39

                                Paul Brower wrote:

                                First thing one learns in a Test Driven Development environment is: switch statements = bad bad bad.

                                Why? How do switch statements affect TDD? Marc

                                Thyme In The Country

                                People are just notoriously impossible. --DavidCrow
                                There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
                                People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

                                P 1 Reply Last reply
                                0
                                • M Marc Clifton

                                  Ennis Ray Lynch, Jr. wrote:

                                  but using Exceptions as a point of logic is not acceptable!

                                  That was one of my beefs with the Parse methods, that I couldn't get access to the underlying validator to test the string without having Parse throw an exception. I raised (harhar) this issue at one of the "meet the developers" meetings and they said it was being addressed in .NET 2.0. I felt that was a good thing. TryParse addresses that issue, IMO. Throwing an exception is expensive, and in some cases I'd rather:

                                  int userInputId=0;
                                  bool success=Int64.TryParse(someText);

                                  Similarly, I don't like writing code like:

                                  if (container.Contains(myKey))

                                  but prefer:

                                  bool success=container.TryGetValue(key, out val);

                                  Because there are many cases when it's OK if the container doesn't contain the key. Marc

                                  Thyme In The Country

                                  People are just notoriously impossible. --DavidCrow
                                  There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
                                  People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

                                  P Offline
                                  P Offline
                                  Phillip Martin
                                  wrote on last edited by
                                  #40

                                  Marc Clifton wrote:

                                  Throwing an exception is expensive

                                  I'm not familiar enough with the CLR to know, but just how expensive is an exception? My background is C++ (where exceptions are potentially very expensive) and Java (where exceptions are very cheap) I'm going to go out on alimb and guess the CLR is somewhere in the middle? - Phil

                                  1 Reply Last reply
                                  0
                                  • T tgrt

                                    I remember seeing it in Reflector too, so don't feel bad. Maybe it changed with SP1?

                                    E Offline
                                    E Offline
                                    Ed Poore
                                    wrote on last edited by
                                    #41

                                    Possibly, can't check since both my dev machines have been updated with it.

                                    1 Reply Last reply
                                    0
                                    • M Marc Clifton

                                      Paul Brower wrote:

                                      First thing one learns in a Test Driven Development environment is: switch statements = bad bad bad.

                                      Why? How do switch statements affect TDD? Marc

                                      Thyme In The Country

                                      People are just notoriously impossible. --DavidCrow
                                      There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
                                      People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

                                      P Offline
                                      P Offline
                                      Paul Brower
                                      wrote on last edited by
                                      #42

                                      Switch statements are one of the most obvious 'code smells.' Typically switch statements are indicative of duplication. Most times when you see a switch statements, you should consider refactoring with polymorphism. Below are some common refactoring methods to deal with switch 'smells.' 1: If you're switching on some kind of code, you'll want a method or class that hosts the type code. (Extract case to new method then move it to the appropriate -- new if necessary -- class where the polymorphism is needed. At that point you can replace type code with State or Strategy pattern. Once that is done, replace conditional with polymorphism, possibly making original method abstract. 2: If you only have a few cases in a single method, and you don't expect change, then polymorphism is definately too much. In this case, you can use the 'Replace Parameter with Explicit Methods'. Create an explicit method for each value of the parameter, for each leg of the conditional, call the appropriate new method, replace each caller of the conditional method with a call to the appropriate new method, remove the conditional method. (Excerpts taken from REFACTORING - IMPROVING THE DESIGN OF EXISTING CODE -- Martin Fowler).

                                      1 Reply Last reply
                                      0
                                      • M Marc Clifton

                                        OK, this is a more language specific post, but the VB thread below got me thinking (a bad thing, I know). For example, being able to do:

                                        switch(myString)
                                        {
                                        case "Hello":
                                        ...
                                        case "Goodbye":
                                        ...
                                        }

                                        is a perfect example of how the language promotes bad programming. The result is a case-sensitive, culture-specific, difficult to extend, and probably format specific within the context of the whole parser, implementation. Now, I personally don't feel a language should (or even can) enforce good programming practices. But a language that supports a bad practice certainly doesn't help the situation. Anyone want to contribute other examples or thoughts? Marc

                                        Thyme In The Country

                                        People are just notoriously impossible. --DavidCrow
                                        There's NO excuse for not commenting your code. -- John Simmons / outlaw programmer
                                        People who say that they will refactor their code later to make it "good" don't understand refactoring, nor the art and craft of programming. -- Josh Smith

                                        S Offline
                                        S Offline
                                        Scott Dorman
                                        wrote on last edited by
                                        #43

                                        Not to continue beating this horse, but how would this really be different than using a sequence of if/else if statements to do the test? You would still run into potential issues with case-sensitivity.

                                        switch (myString)
                                        {
                                        case "Hello":
                                        ...
                                        case "Goodbye":
                                        ...
                                        }

                                        if (myString == "Hello")
                                        {
                                        }
                                        else if (myString == "Goodbye")
                                        {
                                        }
                                        else
                                        {
                                        }

                                        All of these statements evaluate to call bool [mscorlib]System.String::op_Equality(string,string) in IL. To get around the case-sensitivity and culture issues, you can use myString.ToLowerInvariant(), which will still result in the same call to op_Equality. I know that switches are optimized for numeric comparison, but I think it is sometimes necessary to be able to do comparisons of this sort and I would much rather deal with reading a switch statement than a bunch of if/else if statements.

                                        ----------------------------- In just two days, tomorrow will be yesterday.

                                        1 Reply Last reply
                                        0
                                        Reply
                                        • Reply as topic
                                        Log in to reply
                                        • Oldest to Newest
                                        • Newest to Oldest
                                        • Most Votes


                                        • Login

                                        • Don't have an account? Register

                                        • Login or register to search.
                                        • First post
                                          Last post
                                        0
                                        • Categories
                                        • Recent
                                        • Tags
                                        • Popular
                                        • World
                                        • Users
                                        • Groups