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. i don't like object oriented programming

i don't like object oriented programming

Scheduled Pinned Locked Moved The Lounge
csharpc++wpfoop
94 Posts 18 Posters 0 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.
  • H honey the codewitch

    one example I'm running into right now is template specialization. I have a finite state machine engine and it works for any transition input type and any accept symbol type. However, there are additional features that can happen - significant ones that can only exist when the transition type is char - this specialization is effectively a regular expression engine, which means it can parse from a regular expression, and provide regex matching over string inputs. The other kind of FAs it wouldn't even make sense for that. So because of this I have two separate classes - one generic FA class, and one called CharFA where the TInput=char basically. It means more code to maintain because a lot of it is duplicated. To unduplicate a lot of which i could, I'd have to add another codefile with an interface, and another with static methods to share common functionality, which again, increases the code size. So it's not even that I can't do it with C#, it's that what is elegantly handled in C++ is clunky in C# to do the same thing, and requires more code.

    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

    O Offline
    O Offline
    obermd
    wrote on last edited by
    #65

    Take a look at F# or another functional language. State machines and functional languages are made for each other.

    H 1 Reply Last reply
    0
    • O obermd

      Take a look at F# or another functional language. State machines and functional languages are made for each other.

      H Offline
      H Offline
      honey the codewitch
      wrote on last edited by
      #66

      I've strongly considered it. I might eventually move, but I'm familiar with C#. Maybe if they had Haskell I would have moved already. Edit: Adding, one of the drawbacks of functional programming is lack of state, and some of these equations are so complicated that state is necessary for optimization and I wonder how a functional language will handle such a thing. Recomputing or doing lazy iteration over these algorithms is grossly impractical even if it's "correct"

      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

      R 1 Reply Last reply
      0
      • H honey the codewitch

        i never have. give me templates. or you may as well just give me something procedural. if i can't do generic programming i'm a sad honey bear. C# is barely adequate. And it's too object centric IMO. generics need to be able to do more. I want traits. I want the runtimes to do what i can make a C++ compiler do with templates. I probably just got the BAC up of this entire board saying that, but there it is.

        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

        T Offline
        T Offline
        TNCaver
        wrote on last edited by
        #67

        Alan Kay, the father of OOP, says we're doing it all wrong and regrets using the word "object" as it emphasizes the secondary concern of OOP and ignores the primary concern of messaging. Lots of very smart computer scientists say modern OOP makes programming more complex and prone to error rather than simplifying it.

        If you think 'goto' is evil, try writing an Assembly program without JMP.

        H 1 Reply Last reply
        0
        • T TNCaver

          Alan Kay, the father of OOP, says we're doing it all wrong and regrets using the word "object" as it emphasizes the secondary concern of OOP and ignores the primary concern of messaging. Lots of very smart computer scientists say modern OOP makes programming more complex and prone to error rather than simplifying it.

          If you think 'goto' is evil, try writing an Assembly program without JMP.

          H Offline
          H Offline
          honey the codewitch
          wrote on last edited by
          #68

          i like message/signal based systems but most runtimes don't include some basics that should be "primitives/intrinsics" or otherwise first class, like thread safe priority queues and circular buffers and such. At the very least they should be runtime libraries provided with the base framework. But I really think if Alan Kay had wanted a message based programming environment it should have been done somewhat differently than OOP. think something a bit more along lines of parallel programming style constructs and the like, except instead of dealing with iterations of loops you're dealing with signalling. honestly, it's easy enough to create a domain-specific set of "language extension" style headers in C++ to enable this. I love C++ for that. about 1/3 of the language is the headers and because of the way the preprocessor and template system works you can create your own pseudo language constructs. There's nothing else like it in major programming languages but I really wish their was.

          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

          T 1 Reply Last reply
          0
          • H honey the codewitch

            based on my experience, I'd take that bet.

            When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

            S Offline
            S Offline
            Super Lloyd
            wrote on last edited by
            #69

            well.. my assembly is a bit rusty (or almost non existent) I will let you judge... But here my test C# code

            class A
            {
                public void Do(T value)
                {
                    if (value is int intV) Do(intV);
                    else DoDefault(value);
                }
                void DoDefault(T value)
                {
                    Console.WriteLine("Value: " + value);
                }
                void Do(int value)
                {
                    Console.WriteLine("Int: " + value);
                }
            }
            class Program
            {
                static void Main(string\[\] args)
                {
                    A a = new A();
                    a.Do(1);
            
                    A b = new A();
                    b.Do(1.0);
                }
            }
            

            here is the code for a.Do(1) and b.Do(1.0) using go to disassembly in visual studio

                    a.Do(1);
            

            00F70898 mov ecx,dword ptr [ebp-40h]
            00F7089B mov edx,1
            00F708A0 cmp dword ptr [ecx],ecx
            00F708A2 call 00F70478
            00F708A7 nop

                    b.Do(1.0);
            

            00F708C3 fld qword ptr ds:[0F708E8h]
            00F708C9 sub esp,8
            00F708CC fstp qword ptr [esp]
            00F708CF mov ecx,dword ptr [ebp-44h]
            00F708D2 cmp dword ptr [ecx],ecx
            00F708D4 call 00F704A0
            00F708D9 nop

            I think there is no (assembly) if statement and direct execution of the relevant if (type) branch....

            A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

            H 1 Reply Last reply
            0
            • S Super Lloyd

              well.. my assembly is a bit rusty (or almost non existent) I will let you judge... But here my test C# code

              class A
              {
                  public void Do(T value)
                  {
                      if (value is int intV) Do(intV);
                      else DoDefault(value);
                  }
                  void DoDefault(T value)
                  {
                      Console.WriteLine("Value: " + value);
                  }
                  void Do(int value)
                  {
                      Console.WriteLine("Int: " + value);
                  }
              }
              class Program
              {
                  static void Main(string\[\] args)
                  {
                      A a = new A();
                      a.Do(1);
              
                      A b = new A();
                      b.Do(1.0);
                  }
              }
              

              here is the code for a.Do(1) and b.Do(1.0) using go to disassembly in visual studio

                      a.Do(1);
              

              00F70898 mov ecx,dword ptr [ebp-40h]
              00F7089B mov edx,1
              00F708A0 cmp dword ptr [ecx],ecx
              00F708A2 call 00F70478
              00F708A7 nop

                      b.Do(1.0);
              

              00F708C3 fld qword ptr ds:[0F708E8h]
              00F708C9 sub esp,8
              00F708CC fstp qword ptr [esp]
              00F708CF mov ecx,dword ptr [ebp-44h]
              00F708D2 cmp dword ptr [ecx],ecx
              00F708D4 call 00F704A0
              00F708D9 nop

              I think there is no (assembly) if statement and direct execution of the relevant if (type) branch....

              A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

              H Offline
              H Offline
              honey the codewitch
              wrote on last edited by
              #70

              there's a call in there that looks suspicious. I'd need to see the IL, not the asm.

              When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

              S 2 Replies Last reply
              0
              • H honey the codewitch

                based on my experience, I'd take that bet.

                When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                S Offline
                S Offline
                Super Lloyd
                wrote on last edited by
                #71

                Oops forget my previous example, I was confused.. the debug assembly code does indeed look atrocious... Gotta try to check the release version

                A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                H 1 Reply Last reply
                0
                • H honey the codewitch

                  there's a call in there that looks suspicious. I'd need to see the IL, not the asm.

                  When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                  S Offline
                  S Offline
                  Super Lloyd
                  wrote on last edited by
                  #72

                  release code atrocious too...

                  A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                  H 1 Reply Last reply
                  0
                  • S Super Lloyd

                    Oops forget my previous example, I was confused.. the debug assembly code does indeed look atrocious... Gotta try to check the release version

                    A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                    H Offline
                    H Offline
                    honey the codewitch
                    wrote on last edited by
                    #73

                    if there's a call in the resulting asm I'd need to see the IL to find out where it leads. I think the "is" comparison would result in a call to the CLR to type check

                    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                    1 Reply Last reply
                    0
                    • S Super Lloyd

                      release code atrocious too...

                      A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                      H Offline
                      H Offline
                      honey the codewitch
                      wrote on last edited by
                      #74

                      yep. The jitter can only do so much with peephole optimization. That's the ugly truth. Still, the IL will tell the tale. ILDASM or visual studio's decompile option should be able to grab it.

                      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                      1 Reply Last reply
                      0
                      • H honey the codewitch

                        there's a call in there that looks suspicious. I'd need to see the IL, not the asm.

                        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                        S Offline
                        S Offline
                        Super Lloyd
                        wrote on last edited by
                        #75

                        well.. 1. I was saying the compiler will remove obvious dead end code, make sense to check the assembly 2. what interesting is not the generic method's IL, but the concrete A or A code, which I have no clue where to see at any rate, assembly code looks bad.... :(

                        A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                        H 2 Replies Last reply
                        0
                        • S Super Lloyd

                          well.. 1. I was saying the compiler will remove obvious dead end code, make sense to check the assembly 2. what interesting is not the generic method's IL, but the concrete A or A code, which I have no clue where to see at any rate, assembly code looks bad.... :(

                          A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                          H Offline
                          H Offline
                          honey the codewitch
                          wrote on last edited by
                          #76

                          if i can see where that CALL in the asm leads i'd know, but viewing the IL is the only realistic way to tell where it leads

                          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                          S 1 Reply Last reply
                          0
                          • S Super Lloyd

                            well.. 1. I was saying the compiler will remove obvious dead end code, make sense to check the assembly 2. what interesting is not the generic method's IL, but the concrete A or A code, which I have no clue where to see at any rate, assembly code looks bad.... :(

                            A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                            H Offline
                            H Offline
                            honey the codewitch
                            wrote on last edited by
                            #77

                            you know what? I'm still kind of curious about this but I think I'm scrapping the specialization. I'm not sure what I'm going to do about maintenance though. =( This will almost double the code size.

                            When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                            S 1 Reply Last reply
                            0
                            • H honey the codewitch

                              i like message/signal based systems but most runtimes don't include some basics that should be "primitives/intrinsics" or otherwise first class, like thread safe priority queues and circular buffers and such. At the very least they should be runtime libraries provided with the base framework. But I really think if Alan Kay had wanted a message based programming environment it should have been done somewhat differently than OOP. think something a bit more along lines of parallel programming style constructs and the like, except instead of dealing with iterations of loops you're dealing with signalling. honestly, it's easy enough to create a domain-specific set of "language extension" style headers in C++ to enable this. I love C++ for that. about 1/3 of the language is the headers and because of the way the preprocessor and template system works you can create your own pseudo language constructs. There's nothing else like it in major programming languages but I really wish their was.

                              When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                              T Offline
                              T Offline
                              TNCaver
                              wrote on last edited by
                              #78

                              Speaking of Alan Kay and C++...

                              Quote:

                              I made up the term 'object-oriented', and I can tell you I didn't have C++ in mind. -- Alan Kay, OOPSLA '97

                              :-D

                              If you think 'goto' is evil, try writing an Assembly program without JMP.

                              H 1 Reply Last reply
                              0
                              • T TNCaver

                                Speaking of Alan Kay and C++...

                                Quote:

                                I made up the term 'object-oriented', and I can tell you I didn't have C++ in mind. -- Alan Kay, OOPSLA '97

                                :-D

                                If you think 'goto' is evil, try writing an Assembly program without JMP.

                                H Offline
                                H Offline
                                honey the codewitch
                                wrote on last edited by
                                #79

                                if you're using OOP as your primary paradigm in C++ you're almost certainly Doing It Wrong(TM) However, C++ is a truly multi-paradigm language and is fully capable of doing OOP programming. But like I said, if Kay had messaging in mind, OOP probably wasn't the way to go. You can implement a signal passing psuedo language extension in C++ to elegantly handle messaging passing. You can implement an OOP system too, but I wouldn't recommend that.

                                When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                1 Reply Last reply
                                0
                                • H honey the codewitch

                                  if i can see where that CALL in the asm leads i'd know, but viewing the IL is the only realistic way to tell where it leads

                                  When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                  S Offline
                                  S Offline
                                  Super Lloyd
                                  wrote on last edited by
                                  #80

                                  Generic Do() method's IL:

                                  .method public hidebysig instance void Do(!T 'value') cil managed
                                  {
                                  // Code size 58 (0x3a)
                                  .maxstack 2
                                  .locals init ([0] int32 intV,
                                  [1] bool V_1)
                                  IL_0000: nop
                                  IL_0001: ldarg.1
                                  IL_0002: box !T
                                  IL_0007: isinst [mscorlib]System.Int32
                                  IL_000c: brfalse.s IL_0022
                                  IL_000e: ldarg.1
                                  IL_000f: box !T
                                  IL_0014: isinst [mscorlib]System.Int32
                                  IL_0019: unbox.any [mscorlib]System.Int32
                                  IL_001e: stloc.0
                                  IL_001f: ldc.i4.1
                                  IL_0020: br.s IL_0023
                                  IL_0022: ldc.i4.0
                                  IL_0023: stloc.1
                                  IL_0024: ldloc.1
                                  IL_0025: brfalse.s IL_0031
                                  IL_0027: ldarg.0
                                  IL_0028: ldloc.0
                                  IL_0029: call instance void class ConsoleApp1.A`1::Do(int32)
                                  IL_002e: nop
                                  IL_002f: br.s IL_0039
                                  IL_0031: ldarg.0
                                  IL_0032: ldarg.1
                                  IL_0033: call instance void class ConsoleApp1.A`1::DoDefault(!0)
                                  IL_0038: nop
                                  IL_0039: ret
                                  } // end of method A`1::Do

                                  A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                  H 2 Replies Last reply
                                  0
                                  • H honey the codewitch

                                    you know what? I'm still kind of curious about this but I think I'm scrapping the specialization. I'm not sure what I'm going to do about maintenance though. =( This will almost double the code size.

                                    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                    S Offline
                                    S Offline
                                    Super Lloyd
                                    wrote on last edited by
                                    #81

                                    Good luck hey ^^

                                    A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                    1 Reply Last reply
                                    0
                                    • S Super Lloyd

                                      Generic Do() method's IL:

                                      .method public hidebysig instance void Do(!T 'value') cil managed
                                      {
                                      // Code size 58 (0x3a)
                                      .maxstack 2
                                      .locals init ([0] int32 intV,
                                      [1] bool V_1)
                                      IL_0000: nop
                                      IL_0001: ldarg.1
                                      IL_0002: box !T
                                      IL_0007: isinst [mscorlib]System.Int32
                                      IL_000c: brfalse.s IL_0022
                                      IL_000e: ldarg.1
                                      IL_000f: box !T
                                      IL_0014: isinst [mscorlib]System.Int32
                                      IL_0019: unbox.any [mscorlib]System.Int32
                                      IL_001e: stloc.0
                                      IL_001f: ldc.i4.1
                                      IL_0020: br.s IL_0023
                                      IL_0022: ldc.i4.0
                                      IL_0023: stloc.1
                                      IL_0024: ldloc.1
                                      IL_0025: brfalse.s IL_0031
                                      IL_0027: ldarg.0
                                      IL_0028: ldloc.0
                                      IL_0029: call instance void class ConsoleApp1.A`1::Do(int32)
                                      IL_002e: nop
                                      IL_002f: br.s IL_0039
                                      IL_0031: ldarg.0
                                      IL_0032: ldarg.1
                                      IL_0033: call instance void class ConsoleApp1.A`1::DoDefault(!0)
                                      IL_0038: nop
                                      IL_0039: ret
                                      } // end of method A`1::Do

                                      A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                      H Offline
                                      H Offline
                                      honey the codewitch
                                      wrote on last edited by
                                      #82

                                      yep, that's a call to the runtime to do a type check. See isinst? i'll consider our bet a gentleman's bet =D

                                      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                      1 Reply Last reply
                                      0
                                      • S Super Lloyd

                                        Generic Do() method's IL:

                                        .method public hidebysig instance void Do(!T 'value') cil managed
                                        {
                                        // Code size 58 (0x3a)
                                        .maxstack 2
                                        .locals init ([0] int32 intV,
                                        [1] bool V_1)
                                        IL_0000: nop
                                        IL_0001: ldarg.1
                                        IL_0002: box !T
                                        IL_0007: isinst [mscorlib]System.Int32
                                        IL_000c: brfalse.s IL_0022
                                        IL_000e: ldarg.1
                                        IL_000f: box !T
                                        IL_0014: isinst [mscorlib]System.Int32
                                        IL_0019: unbox.any [mscorlib]System.Int32
                                        IL_001e: stloc.0
                                        IL_001f: ldc.i4.1
                                        IL_0020: br.s IL_0023
                                        IL_0022: ldc.i4.0
                                        IL_0023: stloc.1
                                        IL_0024: ldloc.1
                                        IL_0025: brfalse.s IL_0031
                                        IL_0027: ldarg.0
                                        IL_0028: ldloc.0
                                        IL_0029: call instance void class ConsoleApp1.A`1::Do(int32)
                                        IL_002e: nop
                                        IL_002f: br.s IL_0039
                                        IL_0031: ldarg.0
                                        IL_0032: ldarg.1
                                        IL_0033: call instance void class ConsoleApp1.A`1::DoDefault(!0)
                                        IL_0038: nop
                                        IL_0039: ret
                                        } // end of method A`1::Do

                                        A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                        H Offline
                                        H Offline
                                        honey the codewitch
                                        wrote on last edited by
                                        #83

                                        adding ugh - it's not only doing that, it has to box the value first! i forgot about that. Ugh. It makes a copy of the int on the heap just to do a type check No. Just no. Moral of this story is do not trust the C# compiler to significantly optimize your code.

                                        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                        S 1 Reply Last reply
                                        0
                                        • H honey the codewitch

                                          adding ugh - it's not only doing that, it has to box the value first! i forgot about that. Ugh. It makes a copy of the int on the heap just to do a type check No. Just no. Moral of this story is do not trust the C# compiler to significantly optimize your code.

                                          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                          S Offline
                                          S Offline
                                          Super Lloyd
                                          wrote on last edited by
                                          #84

                                          I have to say I am a little confused.. They have numerous intelligent blog about performance... They have fair performance comparison against C++ code with well know perf test with many close call and sometimes better performance... Though when one occasionally check the IL or assembly it seems not really good... All of that leave me quite bewildered....

                                          A new .NET Serializer All in one Menu-Ribbon Bar Taking over the world since 1371!

                                          H 2 Replies 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