[Tutor] Making Doubly Linked List with Less Lines of Code.

WolfRage wolfrage8765 at gmail.com
Thu Dec 25 18:09:19 CET 2014


Thanks, definitely adding this concept into my code. And re-writing. I 
originally hard coded everything just to get it working... but 
obviously, it would have been more time efficient to have thought in 
these terms from the beginning. Hopefully I can learn to write code more 
like this to begin with, even when I just want to get something working.
Reading the rest of your recommendations now.

On 12/25/2014 12:15 AM, Danny Yoo wrote:
> Quick comment: the structure of the code here catches my eye:
>
>
>>          # Each variable below is a link to the head Node in the respective
>>          # row or column.
>>          self.row0 = None
>>          self.row1 = None
>>          self.row2 = None
>>          self.row3 = None
>>          self.row4 = None
>>          self.row5 = None
>>          self.row6 = None
>>          self.row7 = None
>>          self.row8 = None
>>          self.row9 = None
> It seems highly regular; the code here is maintaining a collection of
> row variables.  Because it's so regular, you might consider using a
> list to represent this collection.  Concretely:
>
>      self.rows = [None, None, None, None, None, None, None, None, None, None]
>
> We can express this more concisely in Python as:
>
>      self.row = [None] * 10
>
> Once we have this, then we can get at any particular row through its
> offset.  So instead of:
>
>      self.row0
>
> we say:
>
>      self.row[0]
>
> The big win with a list representation is that the offset can be
> computed.  So if we need to do an operation on each row, we might say:
>
>      for i in range(10):
>          ## ... Do something with self.row[i]
>
> And if you see the full power of this, you'll realize that this allows
> us to express loops to do something to _all_ the rows, expressing that
> action just once.  Or if we need to do something for every other row,
> that too is not too difficult to express:
>
>      for i in range(0, 10, 2):
>          ## ... Do something with self.row[i]
>
>
> In contrast, doing the same thing without using an explicit container
> representation means that doing container-wide actions is harder to
> do.  This is the code smell that we saw at the beginning of this post,
> where we see repetitive code.



More information about the Tutor mailing list