decomposition (slides)

CSc 110 - decomposition

Program decomposition

Program decomposition refers to the process of breaking down a complex program into smaller, more manageable, and understandable parts or components.

It avoids unnecessary common code and improves the structural quality of code.

Class activity one

Compare different types of guitar, write your answers:

  • which parts of code are the same?

  • which parts of code are different?

Classic guitar vs. Retro head guitar

  • which parts of code are the same?

    • the neck and the body
  • which parts of code are different?

    • the head: line 1-4
def print_classic_guitar():
    print_head()
    print_neck()
    print_body()

def print_retro_guitar():
    print_retro_head()
    print_neck()
    print_body()

Classic guitar vs. Long neck guitar

  • which parts of code are the same?

    • the head and the body
  • which parts of code are different?

    • the neck
def print_classic_guitar():
    print_head()
    print_neck()
    print_body()
    
def print_long_guitar():
    print_head()
    print_neck()
    print_neck()
    print_body()

Decompose a program into functions

def print_classic_guitar():
    print_head()
    print_neck()
    print_body()

def print_retro_guitar():
    print_retro_head()
    print_neck()
    print_body()
    
def print_long_guitar():
    print_head()
    print_neck()
    print_neck()
    print_body()

def main():
    print_classic_guitar() # print classic guitar
    print_retro_guitar() # print retro head guitar
    print_long_guitar() # print long neck guitar

main()

Class activity two

Read the code for classic guitar, write your asnwers:

  • which lines of code are the same?

    • in the head:

    • in the neck:

    • in the body:

Class activity two – answers

Read the code for classic guitar, answer the questions:

  • which lines of code are the same?

    • in the head: line 2 - 4

    • in the neck: line 6 - 7

    • in the body: line 9 - 10 and line 14 - 15

Class activity two – answers

print("      ___")
print("    o|* *|o") # head
print("    o|* *|o") # head
print("    o|* *|o") # head
print("     \===/")
print("      |||") # neck
print("      |||") # neck
print("   ___|||___")
print("  /   |||   \ ") # body
print(" /    |||    \ ") # body
print("|     |||     |")
print(" \   (|||)   /")
print("  |   |||   |")
print("  /   |||   \ ") # body
print(" /    |||    \ ") # body
print("/     |||     \ ")
print("|    [===]    |")
print(" \           /")
print("  '.       .'")
print("   '-------'")

Write functions

Write functions print_head, print_neck, and print_body:

def print_classic_guitar():
    print_head()
    print_neck()
    print_body()

def print_long_guitar():
    print_head()
    print_neck()
    print_neck()
    print_body()

def main():
    print_classic_guitar() # print classic guitar
    print_long_guitar() # print long neck guitar

main()

Write functions – answers

def print_head():
    print("      ___")
    print("    o|* *|o")
    print("    o|* *|o")
    print("    o|* *|o")
    print("     \===/")

def print_neck():
    print("      |||" + "\n" + "      |||")
    
def print_body():
    print("   ___|||___")
    print("  /   |||   \ ")
    print(" /    |||    \ ")
    print("|     |||     |")
    print(" \   (|||)   /")
    print("  |   |||   |")
    print("  /   |||   \ ")
    print(" /    |||    \ ")
    print("/     |||     \ ")
    print("|    [===]    |")
    print(" \           /")
    print("  '.       .'")
    print("   '-------'")

def print_classic_guitar():
    print_head()
    print_neck()
    print_body()

def print_long_guitar():
    print_head()
    print_neck()
    print_neck()
    print_body()

def main():
    print_classic_guitar() # print classic guitar
    print_long_guitar() # print long neck guitar

main()
      ___
    o|* *|o
    o|* *|o
    o|* *|o
     \===/
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'
      ___
    o|* *|o
    o|* *|o
    o|* *|o
     \===/
      |||
      |||
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'

Write functions – improved answers

def print_head():
    print("      ___")
    pattern = "    o|* *|o"
    print(pattern)
    print(pattern)
    print(pattern)
    print("     \===/")

def print_neck():
    print("      |||" + "\n" + "      |||")
    
def print_body():
    print("   ___|||___")
    pattern = "  /   |||   \ " + "\n" + " /    |||    \ " 
    print(pattern)
    print("|     |||     |")
    print(" \   (|||)   /")
    print("  |   |||   |")
    print(pattern)
    print("/     |||     \ ")
    print("|    [===]    |")
    print(" \           /")
    print("  '.       .'")
    print("   '-------'")

def print_classic_guitar():
    print_head()
    print_neck()
    print_body()

def print_long_guitar():
    print_head()
    print_neck()
    print_neck()
    print_body()

def main():
    print_classic_guitar() # print classic guitar
    print_long_guitar() # print long neck guitar

main()
      ___
    o|* *|o
    o|* *|o
    o|* *|o
     \===/
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'
      ___
    o|* *|o
    o|* *|o
    o|* *|o
     \===/
      |||
      |||
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'

Add function print_retro_head

def print_head():
    print("      ___")
    pattern = "    o|* *|o"
    print(pattern)
    print(pattern)
    print(pattern)
    print("     \===/")

def print_retro_head():
    print("     ._-_.")
    print("    +|\G/|+")
    pattern = "    +|\./|+"
    print(pattern)
    print(pattern)
    print("     \===/")

def print_neck():
    print("      |||" + "\n" + "      |||")
    
def print_body():
    print("   ___|||___")
    pattern = "  /   |||   \ " + "\n" + " /    |||    \ " 
    print(pattern)
    print("|     |||     |")
    print(" \   (|||)   /")
    print("  |   |||   |")
    print(pattern)
    print("/     |||     \ ")
    print("|    [===]    |")
    print(" \           /")
    print("  '.       .'")
    print("   '-------'")

def print_classic_guitar():
    print_head()
    print_neck()
    print_body()

def print_retro_guitar():
    print_retro_head()
    print_neck()
    print_body()
    
def print_long_guitar():
    print_head()
    print_neck()
    print_neck()
    print_body()

def main():
    print_classic_guitar() # print classic guitar
    print_retro_guitar() # print retro head guitar
    print_long_guitar() # print long neck guitar

main()
      ___
    o|* *|o
    o|* *|o
    o|* *|o
     \===/
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'
     ._-_.
    +|\G/|+
    +|\./|+
    +|\./|+
     \===/
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'
      ___
    o|* *|o
    o|* *|o
    o|* *|o
     \===/
      |||
      |||
      |||
      |||
   ___|||___
  /   |||   \ 
 /    |||    \ 
|     |||     |
 \   (|||)   /
  |   |||   |
  /   |||   \ 
 /    |||    \ 
/     |||     \ 
|    [===]    |
 \           /
  '.       .'
   '-------'

Discussion

Download and run old guitar file and new guitar file:

  • Which version is more readable?

  • Why it is better?