SlideShare a Scribd company logo
Simple
Pure
Java


                    Anton Keks
             anton@codeborne.com
          
The Enterprise...
           
Enterprise Architecture
    20 years ago a new field was born, addressing

    System complexity = more and more
        money for building IT systems

Poor business alignment = more difficult
  to keep those increasingly expensive
   systems aligned with business need

       A problem of more cost, less value
     Today: even more cost, even less value
                           
Complexity


            
!
         O
      BO
 
    ☠   
Your average Java (web) app
    ●   Framework (JSF?)
    ●   Model
    ●   Portal?
    ●   Services!
    ●   Remote services, SOA, EJB
    ●   JNDI
    ●   Stubs, generated code
    ●   How many layers?
                            
...
    ●   Patterns!
    ●   Factory, Singleton, Facade
    ●   Enterprise patterns!
    ●   DTO, DAO, etc
    ●   Getters/setters
         (what's the deal - generate 'em)
    ●   JPA, JAXB
    ●   JMS!

                            
Bad words

     Layer          Tier    Bus
           Context     Manager
     Locator     Assembler    Bean
             Broker      Facade
       Transfer Object    DAO
                 …
    It's always nice to see guys like
       SessionServiceContextManager
    or AbstractStrategyFactoryProxyFacadeBuilder
                             
EAR, WAR, WAR, WAR
      Configuration, descriptors!
                  JNDI!
                 ESB? ;-)

    Must be a wizard to make it all run!
      Improves job security index :-)
                     
For a small thing we create
    ●   ManagedBean
    ●   MegaServiceWrapper
    ●   CoreServiceLocal, Stub (JNDI lookup?)
    ●   CoreService (&& CoreServiceImpl)
    ●   AggregatedService
    ●   ConcreteService
    ●   ConcreteDAO
    ●   JPAAdapter
 
    ●   ...                  
The result?                             ☠
    ●   It kills productivity
    ●   Thousands lines of code, very few
         functionality
    ●   Well hidden ”business logic”
    ●   N minute deploy time (+ N minutes app
         server startup)
    ●   Oops, sometimes redeploy doesn't work,
         need to restart
    ●   Slow UI responsivness
                                 
What to do?
    ●   Concentrate on domain terminology
          ●   This was the intention of OOP


    ●   Avoid overly defensive code
          ●   You are not writing a framework!
          ●   Fellow developers are friends


    ●   Follow Clean Code by Robert C. Martin

                                
Java platform and language
    ●   Java (EE) is a victim of JCP
           ●   Many unreal/unusable JSRs
    ●   Stick to proven open-source stuff
           ●   Less standards – the better
    ●   Java language is ok
           ●   The biggest miss are closures
           ●   DSLs are possible: Mockito, LambdaJ
           ●   Don't bloat (generate) your code


                                 
Code style
    ●   Is your code style limiting readability?
           ●   Avoid too many line breaks and braces
           ●   Emphasize what is important

        public int   size() {              public int size() {
          if (root   == null) {              if (root == null) return 0;
            return   0;                      return root.numSiblings();
          }                                }
          else {
            return   root.numSiblings();
          }
                                           public int size() {
        }
                                             return root != null ?
                                               root.numSiblings() : 0;
                                           }

                                       
Code style
    ●   Avoid over-indenation (or code ladder)
        public void startCharging() {
          if (customer.hasFunds()) {
            if (!station.isCharging()) {
              if (!station.currentlyBooked()) {
                reallyStartCharging();
                return;
              }
            }
          }
          throw new UnableToStartException();
        }
                          public void startCharging() {
                            if (!customer.hasFunds()) throw new UnableToSta
                            if (station.isCharging()) throw new UnableToSta
                            if (station.currentlyBooked()) throw new Unable

                             reallyStartCharging();
                         }
                                       
Code style
    ●   Prefer shorter code (use static imports)
        List<Integer> list = Arrays.asList(1, 2, 3));
        list = Collections.unmodifieableList(list);
        return list;

        import static java.util.Arrays.*;
        import static java.util.Collections.*;
        ...

        return unmodifiableList(asList(1, 2, 3))

        Looks a bit like functional programming, isn't it?

                                  
Code style
    ●   Prefer good naming to comments
    ●   Avoid getters/setters, equals, hashCode,
         toString unless necessary
    ●   Break free from 'conventions'
    ●   Work towards a DSL

        when(session.currentUser()).thenReturn(fakeUser);

        assertThat(person.age, is(25));

        sort(people, on(Person.class).getAge());

                                 
Proper Java app
    ●   Jetty Launcher (esp in development)
    ●   Know the APIs well: servlets, filters, etc
    ●   Avoid vendor-specific stuff
    ●   Keep environment-specific configuration
         in version control
    ●   Dependency Injection
    ●   Avoid scattering cross-cutting concerns
    ●   DB migrations (w/ liquibase/dbdeploy)

 
    ●   Start thin and simple, prefer higher SNR
                             
Web UI
    ●   Your framework tells you don't need to
         know JavaScript? (GWT, JSF, etc)
    ●   B.S.!
    ●   Keep it under control: learn basics of
         JQuery instead
    ●   Knockout.js, Backbone.js can help
    ●   You are not limited with Java syntax on
         the client side :-)

                             
Worth reminding...

    ● Don't Repeat Yourself
    ● Keep It Simple Stupid


    ● You Ain't Gonna Need It


    ● Test Driven Development




                     
Let's continue on
github:
github.com/angryziber/simple-java




job@codeborne.com
                     

More Related Content

Simple Pure Java

  • 1. Simple Pure Java Anton Keks anton@codeborne.com    
  • 3. Enterprise Architecture 20 years ago a new field was born, addressing System complexity = more and more money for building IT systems Poor business alignment = more difficult to keep those increasingly expensive systems aligned with business need A problem of more cost, less value Today: even more cost, even less value    
  • 5. ! O BO   ☠  
  • 6. Your average Java (web) app ● Framework (JSF?) ● Model ● Portal? ● Services! ● Remote services, SOA, EJB ● JNDI ● Stubs, generated code ● How many layers?    
  • 7. ... ● Patterns! ● Factory, Singleton, Facade ● Enterprise patterns! ● DTO, DAO, etc ● Getters/setters (what's the deal - generate 'em) ● JPA, JAXB ● JMS!    
  • 8. Bad words Layer Tier Bus Context Manager Locator Assembler Bean Broker Facade Transfer Object DAO … It's always nice to see guys like SessionServiceContextManager or AbstractStrategyFactoryProxyFacadeBuilder    
  • 9. EAR, WAR, WAR, WAR Configuration, descriptors! JNDI! ESB? ;-) Must be a wizard to make it all run! Improves job security index :-)    
  • 10. For a small thing we create ● ManagedBean ● MegaServiceWrapper ● CoreServiceLocal, Stub (JNDI lookup?) ● CoreService (&& CoreServiceImpl) ● AggregatedService ● ConcreteService ● ConcreteDAO ● JPAAdapter   ● ...  
  • 11. The result? ☠ ● It kills productivity ● Thousands lines of code, very few functionality ● Well hidden ”business logic” ● N minute deploy time (+ N minutes app server startup) ● Oops, sometimes redeploy doesn't work, need to restart ● Slow UI responsivness    
  • 12. What to do? ● Concentrate on domain terminology ● This was the intention of OOP ● Avoid overly defensive code ● You are not writing a framework! ● Fellow developers are friends ● Follow Clean Code by Robert C. Martin    
  • 13. Java platform and language ● Java (EE) is a victim of JCP ● Many unreal/unusable JSRs ● Stick to proven open-source stuff ● Less standards – the better ● Java language is ok ● The biggest miss are closures ● DSLs are possible: Mockito, LambdaJ ● Don't bloat (generate) your code    
  • 14. Code style ● Is your code style limiting readability? ● Avoid too many line breaks and braces ● Emphasize what is important public int size() { public int size() { if (root == null) { if (root == null) return 0; return 0; return root.numSiblings(); } } else { return root.numSiblings(); } public int size() { } return root != null ? root.numSiblings() : 0; }    
  • 15. Code style ● Avoid over-indenation (or code ladder) public void startCharging() { if (customer.hasFunds()) { if (!station.isCharging()) { if (!station.currentlyBooked()) { reallyStartCharging(); return; } } } throw new UnableToStartException(); } public void startCharging() { if (!customer.hasFunds()) throw new UnableToSta if (station.isCharging()) throw new UnableToSta if (station.currentlyBooked()) throw new Unable reallyStartCharging(); }    
  • 16. Code style ● Prefer shorter code (use static imports) List<Integer> list = Arrays.asList(1, 2, 3)); list = Collections.unmodifieableList(list); return list; import static java.util.Arrays.*; import static java.util.Collections.*; ... return unmodifiableList(asList(1, 2, 3)) Looks a bit like functional programming, isn't it?    
  • 17. Code style ● Prefer good naming to comments ● Avoid getters/setters, equals, hashCode, toString unless necessary ● Break free from 'conventions' ● Work towards a DSL when(session.currentUser()).thenReturn(fakeUser); assertThat(person.age, is(25)); sort(people, on(Person.class).getAge());    
  • 18. Proper Java app ● Jetty Launcher (esp in development) ● Know the APIs well: servlets, filters, etc ● Avoid vendor-specific stuff ● Keep environment-specific configuration in version control ● Dependency Injection ● Avoid scattering cross-cutting concerns ● DB migrations (w/ liquibase/dbdeploy)   ● Start thin and simple, prefer higher SNR  
  • 19. Web UI ● Your framework tells you don't need to know JavaScript? (GWT, JSF, etc) ● B.S.! ● Keep it under control: learn basics of JQuery instead ● Knockout.js, Backbone.js can help ● You are not limited with Java syntax on the client side :-)    
  • 20. Worth reminding... ● Don't Repeat Yourself ● Keep It Simple Stupid ● You Ain't Gonna Need It ● Test Driven Development