Design orientato agli oggetti per creare immagini in Python

5

Sto creando immagini con testo centrato. Io uso Python ma mi trovo di fronte a molte domande su come scrivere il mio class. Lo so

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

Bene, l'unica cosa che voglio fare con questa classe è print centered text on a background image , ma penso di aver bisogno di aiuto per capire davvero questo dato che ho molte domande:

  • Devo scrivere una classe che abbia un metodo per creare lo sfondo Immagine?
  • Dovrei avere un altro metodo nella stessa classe per mettere il testo al centro del immagine di sfondo?
  • E quando salvi l'immagine sul disco? Dovrei hai un altro metodo per salvare l'immagine?

Se sono corretto, la mia classe sarà simile a questa:

# -*- 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")                                              
~                                  

Mi sembra bello. Ma il fatto è che il metodo print_text_image ha molte responsabilità:

  • Calcola la quantità di pixel dell'immagine che possiamo usare (larghezza * altezza)
  • Calcola la quantità di pixel che il testo utilizzerà e se non si adatta riduciamo la dimensione del font fino a quando non si adatta (prova & errore)
  • Calcola i margini e infine stampa il testo sull'immagine in modo centrato

Mi sembra che possiamo utilizzare almeno un altro metodo sulla mia classe CreateImage :

  • Un metodo per calcolare se la dimensione del carattere (testo) è abbastanza piccola da adattarsi all'immagine (restituisce true o false)

Ma non ne sono sicuro. Voglio avere un buon design nella mia classe perché in seguito userò questa classe come base per altre classi (ad esempio, un'altra classe incolla altre immagini nell'immagine che CreateImage crea.)

In definitiva, quale sarebbe il tuo progetto per questa classe? Apprezzerò molto se ti prendi il tempo per aiutarmi a capire questo. Grazie mille in anticipo.

    
posta Javittoxs 05.12.2015 - 01:51
fonte

1 risposta

3

La tua citazione è sbagliata. È sbagliato dire "una classe dovrebbe fare una cosa e farla bene". Una classe non fa nulla. Meglio dire "una classe dovrebbe essere una cosa ed essere quella cosa bene".

"Crea" è un verbo. "CreateImage" suona come il nome di una funzione, non di una classe. Una classe dovrebbe essere il tipo di cosa che descriveresti con un nome, come "Immagine".

Puoi vedere il problema se leggi i tuoi metodi.

CreateImage.Save()'

Che cosa? Stai salvando un createimage? Ha senso?

CreateImage.create_background()

Che cosa? Sei creare_backgrounding a CreateImage? Che diavolo significa?

Rinominiamo:

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)  

Ora leggiamo:

Image.add_background

Oh, beh, ovviamente questo aggiunge uno sfondo all'immagine

Image.add_text

Oh, beh, ovviamente questo aggiunge del testo a un'immagine

Image.save

Oh, beh, ovviamente quello salva l'immagine

Quindi la tua classe va bene. È il tuo nome che ha bisogno di lavoro. Se fai il nome appropriato, puoi spesso dire se la tua classe ha senso se legge in modo naturale.

Una classe è un nome. È una cosa con cui fai roba.

Una funzione / metodo è un verbo. È una cosa che fa roba con altre cose. (Sì, in alcune lingue una funzione è un oggetto, ma non è così importante quando si parla di design a questo livello.)

Se tenga questo a mente, e ricorda anche che in ogni caso, una classe dovrebbe essere una singola cosa concettuale, e una funzione dovrebbe fare una singola cosa concettuale, starai bene.

    
risposta data 05.12.2015 - 05:52
fonte