From: salamond on
Guys, I'm not sure if this is the right place to ask questions like this.

I'm a software tester, working for 4.5 years.
Most of the work is about manual testing, for 1-2 month per year, I
need to write my own scripts for automation or tools.

For the first 2 years, all scripts are pure steps, do step1, step2, if
fail, exit.

Then I came across this book: clean-code: a hand book to agile
software craftsmanship.

I read it through once, several chapters twice or even more.
My code starts to evolve with more structured functions, meaningful names, etc.

Now that I want to try OO, to change my procedure function level to class level.
But I just don't know how to evaluate my OO designs, how to start
refactor functions to classes.

Is there any books, tutorials, heurstic lists that I can start reading
or practice?

Thanks

JaordZZ

From: Jay on
Hi JaordZZ,
I began software development using OOP can't recall any books to
recommend. I would encourage you to think critically about when to use
OOP, rather than doing it simply because of Agile dogma. When
reviewing my code, I've often found that I tend to use classes for
everything -- just out of habit (and due to a heavy Java background).
When coding, I now try to ask myself, "Does this code represent
something that benefits from OOP, or should it exist as a function(or
Module or static method)?".

Here are some of the most common reasons to consider OOP:

1) Making state information handy to the functions that need it.
If you find yourself passing the same data in as parameters to related
functions, then consider wrapping the data and functions up into a
class.

2) Organizing large amounts of code
OOP allows you to present public interfaces that simplify the usage of
code. This is very helpful for large projects, but not usually
necessary for smaller scripts and projects.

3) Use of inheritance or polymorphism
If you want to benefit from subclassing objects.


And some common reasons to consider your current approach:
1) You are already using it and it works (or does it?)
2) There is a small performance penalty with each object that is
instantiated


I know this is very oversimplified, but my lunch break is ending
soon. ;-)
Hope that helps a little.
From: Robert Klemme on
On 09.07.2010 19:11, Jay wrote:
> Hi JaordZZ,
> I began software development using OOP can't recall any books to
> recommend. I would encourage you to think critically about when to use
> OOP, rather than doing it simply because of Agile dogma. When
> reviewing my code, I've often found that I tend to use classes for
> everything -- just out of habit (and due to a heavy Java background).
> When coding, I now try to ask myself, "Does this code represent
> something that benefits from OOP, or should it exist as a function(or
> Module or static method)?".
>
> Here are some of the most common reasons to consider OOP:
>
> 1) Making state information handy to the functions that need it.
> If you find yourself passing the same data in as parameters to related
> functions, then consider wrapping the data and functions up into a
> class.

The key word for this is "encapsulation". I believe it is the most
important aspect of OO.

> 2) Organizing large amounts of code
> OOP allows you to present public interfaces that simplify the usage of
> code. This is very helpful for large projects, but not usually
> necessary for smaller scripts and projects.

I think this is normally named "information hiding". I use it even for
smaller scripts.

> 3) Use of inheritance or polymorphism
> If you want to benefit from subclassing objects.

IMHO inheritance is overrated (or maybe overused). Often people turn to
inheritance where composition would be a better choice. But I agree,
this is another important aspect of OO.

> And some common reasons to consider your current approach:
> 1) You are already using it and it works (or does it?)
> 2) There is a small performance penalty with each object that is
> instantiated
>
>
> I know this is very oversimplified, but my lunch break is ending
> soon. ;-)

.... and I have to go to bed now. :-)

Cheers

robert


PS: JaordZZ, a book or tutorial about patterns might help. See here for
a start:
http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
From: salamond on
Thanks, Robert and Jay.

I started programming with C, not the type of a natural OO programmer.
And yes, the Procedure Oriented way, or function way works fine for
me, almost all the time.

Until I'm considering adding unit tests to my own scripts.
With the mock pattern, an interface like Cat with a function
"catchRats" is a must to have, then CatImp and CatMock.
That's how mock works.

That's where I start thinking, maybe it's time to OO.

But as you say, it doesn't have to be OO all the time,
unless there is a specific problem better be solved that way.

So here's what I'll try:
* I have a copy of Design Patterns by "gang of 4", seldom read, I'll start now
* I think if unit testing is what I need, I should go through unit
testing patterns, see how OO works for a real problem
* I'll definately follow your suggestions, see if there's sign for OO
in my scripts, (encapsulation, etc).

Again, many thanks to you guys.



On Sat, Jul 10, 2010 at 5:15 AM, Robert Klemme
<shortcutter(a)googlemail.com> wrote:
> On 09.07.2010 19:11, Jay wrote:
>>
>> Hi JaordZZ,
>> I began software development using OOP can't recall any books to
>> recommend. I would encourage you to think critically about when to use
>> OOP, rather than doing it simply because of Agile dogma.  When
>> reviewing my code, I've often found that I tend to use classes for
>> everything -- just out of habit (and due to a heavy Java background).
>> When coding, I now try to ask myself, "Does this code represent
>> something that benefits from OOP, or should it exist as a function(or
>> Module or static method)?".
>>
>> Here are some of the most common reasons to consider OOP:
>>
>> 1) Making state information handy to the functions that need it.
>> If you find yourself passing the same data in as parameters to related
>> functions, then consider wrapping the data and functions up into a
>> class.
>
> The key word for this is "encapsulation".  I believe it is the most
> important aspect of OO.
>
>> 2) Organizing large amounts of code
>> OOP allows you to present public interfaces that simplify the usage of
>> code.  This is very helpful for large projects, but not usually
>> necessary for smaller scripts and projects.
>
> I think this is normally named "information hiding".  I use it even for
> smaller scripts.
>
>> 3) Use of inheritance or polymorphism
>> If you want to benefit from subclassing objects.
>
> IMHO inheritance is overrated (or maybe overused).  Often people turn to
> inheritance where composition would be a better choice.  But I agree, this
> is another important aspect of OO.
>
>> And some common reasons to consider your current approach:
>> 1) You are already using it and it works (or does it?)
>> 2) There is a small performance penalty with each object that is
>> instantiated
>>
>>
>> I know this is very oversimplified, but my lunch break is ending
>> soon.  ;-)
>
> ... and I have to go to bed now. :-)
>
> Cheers
>
>        robert
>
>
> PS: JaordZZ, a book or tutorial about patterns might help.  See here for a
> start:
> http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29
>
> --
> remember.guy do |as, often| as.you_can - without end
> http://blog.rubybestpractices.com/
>
>

From: Robert Klemme on
On 10.07.2010 01:44, salamond wrote:
> Thanks, Robert and Jay.
>
> I started programming with C, not the type of a natural OO programmer.
> And yes, the Procedure Oriented way, or function way works fine for
> me, almost all the time.

The funny thing is, you can code OO even in a language like C. Of
course it is much easier in a truly OO language but if you look at the C
standard library you can look at it in a OO way in parts. For example
look at syscalls open(), write(), read() and close(). open() returns a
file descriptor (aka object id) and this is what you pass to the other
three methods - pardon: functions - along with more parameters. You can
see read() and write() as ordinary methods and close() as the
destructor. Of course you do not have polymorphism in C but these
functions are definitively a case of encapsulation: you do not really
know (nor do you need to know) what your operating system's kernel
stores along with the file descriptor and how it performs all those
operations.

> Until I'm considering adding unit tests to my own scripts.
> With the mock pattern, an interface like Cat with a function
> "catchRats" is a must to have, then CatImp and CatMock.
> That's how mock works.
>
> That's where I start thinking, maybe it's time to OO.
>
> But as you say, it doesn't have to be OO all the time,
> unless there is a specific problem better be solved that way.
>
> So here's what I'll try:
> * I have a copy of Design Patterns by "gang of 4", seldom read, I'll start now
> * I think if unit testing is what I need, I should go through unit
> testing patterns, see how OO works for a real problem
> * I'll definately follow your suggestions, see if there's sign for OO
> in my scripts, (encapsulation, etc).

Sounds like a plan. I am not sure though about the connection you are
doing between unit testing and OO. Although most testing frameworks in
Ruby are in fact object oriented the whole concept of unit testing also
works for non OO code - and a testing framework does not necessarily
need to be OO.

A strategy for finding classes that I find pretty slick is CRC Cards.
This does not have too much overhead and leaves out a lot of detail in
the first step. IMHO that helps concentrating on abstract entities.
http://en.wikipedia.org/wiki/Class-responsibility-collaboration_card

Another book I usually recommend for in depth coverage of OO is OOSC:
http://docs.eiffel.com/book/method/object-oriented-software-construction-2nd-edition

Although it does cover a completely different programming language
(Eiffel) it covers all OO concepts I am aware of in a very minute manner.

> Again, many thanks to you guys.

You're welcome!

Kind regards

robert

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/
 |  Next  |  Last
Pages: 1 2
Prev: Ruby WARC Parser
Next: RUBY_VERSION_* macros in C?