O modo per raccogliere dati da più oggetti senza getter

1

Sto scrivendo un sistema che contiene un numero di oggetti con i dati. Ad esempio, un oggetto ha un attributo del nome utente, un altro ha una data, un altro elemento del carrello acquisti ecc.

Sto creando un oggetto che genera un hash MD5 basato su una stringa concatenata di questi valori. Quindi ad esempio md5(username + date + special_number + cart_id) .

Il modo in cui stavo per farlo era passare l'oggetto md5_generator gli uni agli altri gli altri oggetti a loro volta permettendo loro di chiamare un metodo add_x (ad esempio add_username ) sul generatore per aggiungere il loro specifico pezzo di dati. Questo evita di estrarre i dati da ogni oggetto, che voglio evitare.

Mi chiedo se questa sia la migliore idea o se ci sia un modello OO più semplice che mi manca?

    
posta Cormac Mulhall 14.10.2013 - 17:38
fonte

2 risposte

3

Potresti avere un add_data(key, data) sull'oggetto generatore di hash per consentire genericamente l'aggiunta di qualsiasi dato:

class HashGenerator(...):
    def __init__(self):
        self.data = []

    def add_data(self, key, data):
        self.data.append((key, data))

    def calc_hash(self):
        self.data.sort()
        return hashlib.md5("|".join(data for _key, data in self.data))

che a loro volta vengono passati gli oggetti dati e usano:

class UserNameObject(...):
    def inject_data(self, hash_generator):
        hash_generator.add_data('username', self.username)

Oppure, se preferisci che gli oggetti dati siano inconsapevoli del generatore di hash che potresti fare (che tecnicamente sarebbe meglio):

class UserNameObject(...):
    def get_hash_tuple(self):
        return ('username', self.username)

Tuttavia, ti consiglio di utilizzare SHA1 anziché MD5 perché è più sicuro ma, a seconda dello scopo dell'hash, il miglior algoritmo potrebbe variare.

    
risposta data 14.10.2013 - 17:48
fonte
0

Potresti usare una riflessione per scoprire quali proprietà ha ciascun oggetto e aggiungerle dinamicamente al generatore.

In pseudo codice:

class HashGenerator {
   String generate(Object o) {
      String combined = "";
      for each( property in o ) {
          combined += o[property];
      }

      return md5(combined);
   }
}

A seconda del linguaggio di programmazione ci saranno diversi modi per far funzionare property in o .

    
risposta data 14.10.2013 - 18:04
fonte

Leggi altre domande sui tag