Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #3862

Re: About using assertion

From Lew <noone@lewscanon.com>
Newsgroups comp.lang.java.programmer
Subject Re: About using assertion
Date 2011-05-09 11:35 -0400
Organization albasani.net
Message-ID <iq91jn$2uo$1@news.albasani.net> (permalink)
References <f1e4cc83-8596-4e53-bed7-34a5209fe8c4@k3g2000prl.googlegroups.com>

Show all headers | View raw


byhesed wrote:
> I am reading a book about object-oriented design pattern.
> The book, Object-Oriented Software Development Using Java 2/e by
> Xiaoping Jia, says that...
>
>     Using assertions derived from the preconditions for all methods is
> known as defensive programming.
>     Its aim is to prevent a component from being misused.
>
>     Design Guideline: Use Assertions Aggressively
>
>     Each method should include assertions on the preconditions and
> postconditions of the method and invariants of the class
>
> Do I have to always use assertion?
> Is it better to use assertion?
>
> What's your idea?

Assertions are an excellent tool for their purpose, much as a hammer is an 
excellent tool for its purpose.  Either can be misused.  A hammer is not a 
good tool to saw wood.  Assertions are not a good tool to handle exceptions.

Java's 'assert' is a keyword to support assertions, which are a wider 
computer-science concept.  (Note that this differs from the JUnit 
'Assert...()' family of methods.)
<http://en.wikipedia.org/wiki/Assertion_(computing)>

Assertions document and enforce invariants, preconditions and postconditions. 
  These are algorithmic concepts, applicable to all programming, not just 
object-oriented.  Research them thoroughly.

An invariant is something that must hold true if you follow the algorithm.  It 
might be an invariant that an array index is valid, or that an attribute is 
not null.  It's a precondition if the invariant holds prior to some action or 
transformation.  It's a postcondition if the invariant holds just after some 
action or transformation.

Exceptions are a tool, among others, that causes invariants to hold true. 
Assertions, i.e., Java 'assert' expressions, prove that that enforcement 
worked correctly.  Succinctly:  Exceptions enforce, assertions prove.

Remember that assertions can be turned off at classload time.  Exceptions cannot.

For example, suppose you have a requirement that a particular attribute is 
never 'null'.  You enforce that with a setter method using 'if' and 
exceptions.  You prove that the enforcement worked using 'assert'.

  package com.lewscanon.eegee;
  import org.apache.log4j.Logger;

  public class Foo
  {
    private final transient Logger logger =
      Logger.getLogger( getClass() );

    private Bar bar = new Bar();
    public Bar getBar()
    {
      assert bar != null; // invariant
      return bar;
    }
    public void setBar( Bar newb )
    {
      if ( newb == null )
      {
        IllegalArgumentException exc =
         new IllegalArgumentException( "null Bar" );
        logger.error( exc );
        throw exc;
      }
      bar = newb;
      assert bar != null; // postcondition
  }

Notice that assertions do NOT enforce rules for the argument to a 'public' 
method; they only demonstrate that code under the class's own control did its 
job.  So the class's own code enforces that the argument is not 'null', then 
the 'assert' demonstrates that it worked.

You realize that 'assert' cannot enforce arguments to public methods because 
it can be disabled.  Assertions don't always have to be on, but the truth they 
prove should always be true. So exceptions (and ifs) always enforce, 
assertions sometimes prove.

The JLS defines the 'assert' stuff here:
<http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10>

This article gives good guidance for 'assert':
<http://download.oracle.com/javase/1.4.2/docs/guide/lang/assert.html>

This article describes the mechanics of Java's 'assert' mechanism, but not
much about why or when you'd want to:
<http://online.wsj.com/article/SB10001424052748703280904576247152267875970.html?mod=googlenews_wsj>

You should be well-schooled in algorithmic invariants and assertions 
regardless of your platform.

-- 
Lew
Honi soit qui mal y pense.
http://upload.wikimedia.org/wikipedia/commons/c/cf/Friz.jpg

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

About using assertion byhesed <byhesed@gmail.com> - 2011-05-09 07:36 -0700
  Re: About using assertion Robert Klemme <shortcutter@googlemail.com> - 2011-05-09 08:24 -0700
    Re: About using assertion Roedy Green <see_website@mindprod.com.invalid> - 2011-05-09 09:01 -0700
      Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-09 12:11 -0400
        Re: About using assertion Robert Klemme <shortcutter@googlemail.com> - 2011-05-09 22:17 +0200
          Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-09 18:49 -0400
            Re: About using assertion Robert Klemme <shortcutter@googlemail.com> - 2011-05-10 07:23 +0200
            Re: About using assertion Arved Sandstrom <asandstrom3minus1@eastlink.ca> - 2011-05-10 06:45 -0300
              Re: About using assertion Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-05-10 13:29 +0000
                Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-10 11:21 -0400
                Re: About using assertion Andreas Leitgeb <avl@gamma.logic.tuwien.ac.at> - 2011-05-10 16:01 +0000
                Re: About using assertion RedGrittyBrick <RedGrittyBrick@spamweary.invalid> - 2011-05-10 17:26 +0100
                Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-10 13:25 -0400
                Re: About using assertion Daniele Futtorovic <da.futt.news@laposte-dot-net.invalid> - 2011-05-10 21:15 +0200
          Re: About using assertion tmcd@tmcd-p4-linux.austin.tx.us (Tim McDaniel) - 2011-05-19 00:32 -0500
            Re: About using assertion Michal Kleczek <kleku75@gmail.com> - 2011-05-19 08:34 +0200
              Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-19 08:46 -0400
                Re: About using assertion Michal Kleczek <kleku75@gmail.com> - 2011-05-19 15:16 +0200
                Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-19 09:38 -0400
                Re: About using assertion Robert Klemme <shortcutter@googlemail.com> - 2011-05-19 07:41 -0700
                Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-19 11:00 -0400
            Re: About using assertion Patricia Shanahan <pats@acm.org> - 2011-05-19 05:52 -0700
  Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-09 11:35 -0400
  Re: About using assertion markspace <-@.> - 2011-05-09 11:40 -0700
    Re: About using assertion Lew <noone@lewscanon.com> - 2011-05-09 14:53 -0400

csiph-web