Design orientado a objeto para criar imagens em Python

5

Estou criando imagens com texto centralizado. Eu uso o Python, mas me deparo com muitas questões sobre como escrever meu class. Eu sei que

A class must aim to do one thing and do it well.

Bem, a única coisa que quero fazer com essa classe é print centered text on a background image , mas acho que preciso de ajuda para realmente entender isso, pois tenho muitas perguntas:

  • Devo escrever uma turma que tenha um método para criar o plano de fundo imagem?
  • Devo ter outro método na mesma classe para colocar o texto centralizado no imagem de fundo?
  • E quando salvo a imagem no disco? Eu devo tem outro método para salvar a imagem?

Se eu estiver correto, minha turma ficará assim:

# -*- coding: utf-8 -*-                                                         

class CreateImage():                                                            
    def create_background(self):                                                
        print("Creating background")                                            
    def print_text_image(self, text):                                           
        print("Printing the following text on Image: ")                         
        print(text)                                                             
    def save(self, destination):                                                
        print("Saving the image on disk on: ")                                  
        print(destination)                                                      

my_object = CreateImage()                                                       
my_object.print_text_image("Hello World!")                                      
my_object.save("Images/my_images")                                              
~                                  

Parece bom para mim. Mas a questão é que o método print_text_image tem muitas responsabilidades:

  • Calcule quantos pixels na imagem podemos usar (largura * altura)
  • Calcule quantos pixels o texto vai usar e, se não couber, reduzimos o tamanho da fonte até que ela caiba (tentativa e erro)
  • Calcule as margens e, finalmente, imprima o texto na imagem de forma centralizada

Parece que podemos usar pelo menos mais um método na minha CreateImage class:

  • Um método para calcular se o tamanho da fonte (texto) é pequeno o suficiente para caber na imagem (retorno verdadeiro ou falso)

Mas não tenho certeza. Eu quero ter um bom design na minha classe, porque mais tarde eu vou usar essa classe como base para outras classes (por exemplo, outra classe irá colar outras imagens na imagem que CreateImage cria).

Em definitivo, qual seria o seu design para esta aula? Eu realmente aprecio se você tomar o tempo para me ajudar a entender isso. Muito obrigado antecipadamente.

    
por Javittoxs 05.12.2015 / 01:51
fonte

1 resposta

3

Sua cotação está errada. É errado dizer "uma classe deve fazer uma coisa e fazer bem". Uma turma não faz nada. Melhor dizer "uma aula deve ser uma coisa e ser bem".

"Criar" é um verbo. "CreateImage" soa como o nome de uma função, não uma classe. Uma classe deve ser o tipo de coisa que você descreveria com um substantivo, como "Imagem".

Você pode ver o problema se ler seus métodos.

CreateImage.Save()'

O que? Você está salvando uma criação de imagem? Isso faz sentido?

CreateImage.create_background()

O que? Você é create_backgrounding um CreateImage? O que diabos isso significa?

Vamos renomear:

class Image():                                                            
   def add_background(self):                                                
      print("Addinging background")   

   def add_text(self, text):                                           
      print("Adding the following text to Image: ")                         
      print(text)                                  

   def save(self, destination):                                                
      print("Saving the image on disk on: ")                                  
      print(destination)  

Agora vamos ler:

Image.add_background

Oh, bem, obviamente, isso adiciona um plano de fundo à imagem

Image.add_text

Oh, bem, obviamente, isso adiciona texto a uma imagem

Image.save

Oh, bem, obviamente, isso salva a imagem

Portanto, a sua turma está bem. É o seu nome que precisa de trabalho. Se você nomear apropriadamente, muitas vezes você poderá dizer se a sua turma faz sentido se ler naturalmente.

Uma classe é um substantivo. É uma coisa que você faz coisas com.

Uma função / método é um verbo. É uma coisa que faz coisas com outras coisas. (Sim, em algumas linguagens, uma função é um objeto, mas isso não é tão importante quando se fala em design neste nível.)

Se você mantiver isso em mente, e também tenha em mente que, em cada caso, uma classe deve ser uma única coisa conceitual, e uma função deve fazer uma única coisa conceitual, você ficará bem.

    
por 05.12.2015 / 05:52
fonte