Refactoring in Tunes

Laurent Martelli martelli@iie.cnam.fr
09 Jan 2000 02:29:29 +0100


>>>>> "bill" == btanksley  <btanksley@hifn.com> writes:

  >> From: Laurent Martelli [mailto:martelli@iie.cnam.fr] Subject: Re:
  >> Refactoring in Tunes

  >> >>>>> "bill" == btanksley <btanksley@hifn.com> writes:

  bill> you're asking for.  "Refactoring" is generally used to
  bill> indicate the process of changing the way code put together in
  bill> order to produce a better fit to a better design.  In other

  bill> Refactoring in this sense cannot be helped by a runtime
  bill> system, but it can be helped by a language designed for it.
  bill> Forth is well-suited for refactoring because of its absence of
  bill> explicit variables; Java works well because of it moderately
  bill> strong compile-time typechecking (to help the programmer catch
  bill> typos written during the refactoring); and Smalltalk works
  bill> well because there are automated tools to performs some of the
  bill> most common refactorings.

  >> I can't what makes C more difficult to refactor than smalltalk. I

  bill> I didn't mention C at all here.

I I don't think that a language is more refactorable than an other, so
I just took C as an example.

  bill> However, let's take a look at it.  C has slightly stronger
  bill> typechecking than Smalltalk, so the C compiler will warn you
  bill> of a few errors; however, C's typechecking is weak enough that
  bill> if you try to take advantage of it you'll wind up letting a
  bill> lot of errors slip by you.  Advantage: neither one.

What has refactoring to do with typechecking ?

  bill> Smalltalk has more possible refactorings: it's easy to make a
  bill> "parameter object" im Smalltalk, and it's hard in C.  It's
  bill> even harder in C to do refactorings which "split" a function
  bill> which has internal state, but Smalltalk (of course) has no
  bill> trouble at all.  Strong advantage to Smalltalk.

I don't see what you're talking about. Can you give an example ?

  bill> Smalltalk wins versus C, all in all, because as an OO language
  bill> it has many more possible refactorings.

What makes you think so ?

  bill> Smalltalk looks a lot worse than Java for refactoring, but
  bill> because Smalltalk is interactive, it's possible to get your
  bill> unit tests out of the way a LOT quicker, and this speed
  bill> encourages frequent refactoring, which makes the final design
  bill> likely to be a LOT nicer.  In addition, Smalltalk has tools
  bill> for refactoring which are only beginning to be developed for
  bill> Java.

  >> think that refactoring does not only apply to OO languages. I see
  >> it as finding patterns which are used more than once.
  bill> [snipped: example of finding redundant patterns, making them
  bill> into a function, and calling the function from both places]

  bill> No, that's function factoring, not Refactoring.  My
  bill> "Refactoring" book calls that "Extract Method".  Refactoring
  bill> also includes the inverse of that -- "Inline Method".  A good
  bill> coder should know how to do both refactorings; sometimes you
  bill> need to inline a method in order to get special behavior

Are you saying that there are things that you can only do by inlining ? 

  bill> (or because you made a poor choice of factoring earlier and
  bill> now you have to redivide your functions' functionality).

  >> When you're dealing with OOL, you introduce new base classes, but
  >> it's the same mechanism.

  bill> The full art of refactoring is about being able to change the
  bill> design of a program, not simply make it take up less space.
  bill> You accomplish that change in two steps: first, you apply
  bill> source changes which preserve the old behavior but provide a
  bill> more suitable class or function layout (these are what Fowler
  bill> calls "refactorings"); and second, you change the arrangement
  bill> of these new classes to provide your new behavior.

Thanks for the clarification on the meaning of refactoring. But I
still don't see why refactoring could only be applied to OO. Excepted
that you use `class' in your definition. If you only take the first
part of the defitinition (``The full art of refactoring is about being
able to change the design of a program''), it can be applied to any
language. 

-- 
Laurent Martelli
martelli@iie.cnam.fr