Trasformazione del valore a livello di proprietà per il casting di oggetti indiretti

1

Esiste un linguaggio di programmazione per supportare l'esplicita copia dell'oggetto a livello di proprietà?

Ad esempio, supponi questo codice:

public class Student
{
    public string Name { get; set; }

    public string Code { get; set; }

    public List<string> Interests { get; set; }
}

public class Item
{
    public string Name { get; set; } 

    public string Code { get; set; }
}

Mi chiedo se ci sia un compilatore (o una lingua) là fuori che può indirettamente lanciare due oggetti tra loro, in base alla corrispondenza a livello di proprietà e un algoritmo di trasformazione con perdite?

  1. Crea un'istanza della classe di destinazione
  2. Utilizzando reflection, trova tutte le proprietà della classe di destinazione
  3. Per ogni proprietà, prova a trovare una corrispondenza nella classe di origine, utilizzando il nome e il tipo
  4. Se trovato, trasferisci il valore
  5. Altrimenti, inizializza al valore predefinito

Ovviamente, questo dovrebbe essere fatto esplicitamente con la piena intenzione dello sviluppatore. Ad esempio, una pseudo-sintassi C # potrebbe essere simile a:

Student student = new Student();
student.Name = "Saeed";
student.Code = "513223";
Item item = copy student; // assume "copy" to be a keyword
// Here, item's name is "Saeed" and its code is "513223"
    
posta Saeed Neamati 13.08.2014 - 07:37
fonte

3 risposte

4

Penso che uno dei motivi per cui questo non è diffuso ha a che fare con il significato di nomi all'interno di un linguaggio di programmazione. Il fatto che una classe A abbia un campo x e una classe B ha anche un campo x non dimostra che questi due campi siano in alcun modo comparabili - uno potrebbe essere un valore in un 2-D sistema di coordinate e l'altro una variabile dipendente in un problema di modellazione statistica. (L'esempio standard di questo in letteratura è che sia una classe Tree che una classe Dog potrebbero avere un membro bark , ma probabilmente saranno molto diverse.)

Se gestisci solo oggetti A , hai un certo tipo di garanzia che la x di un oggetto è come x di un altro oggetto, solo di valore maggiore o minore. Tra le classi, tutte le scommesse sono disattivate. E se tutti i campi con nomi simili sono comparabili nel modo desiderato, allora è più probabile che le classi siano collegate per cominciare, così puoi ottenere ciò che vuoi tramite normale Oggetto oggetto .

    
risposta data 13.08.2014 - 08:42
fonte
3

Non credo che nessuna lingua supporti esplicitamente tale operazione a livello di linguaggio. Il problema principale è la sua complessità. Potrebbe sembrare semplice nel tuo esempio, ma se guardi qualcosa come Automapper , noterai che c'è tanta complessità per l'utente di tale funzione vorrebbe / avrebbe bisogno. E quanto più è complessa la funzione di linguaggio, tanto più ci dovrebbe essere per utilizzarla, quindi è proficuo implementarla. E mentre ho trovato alcuni casi in cui tale funzionalità sarebbe stata piacevole, non è un requisito di programmazione comune. Inoltre, diventa ancora meno utile implementare una funzionalità linguistica, quando puoi fare la stessa cosa senza di essa, vedi Automapper per C #.

Dall'altro lato, se consideri solo la mappa del binding / dell'interfaccia del metodo invece della copia profonda, allora quello che stai cercando si chiama La tipizzazione strutturale e le lingue supportate esistono come OCaml o Go.

    
risposta data 13.08.2014 - 07:58
fonte
1

Conosco le lingue con questa funzione o qualcosa di simile.

Quello che è meglio dimenticare è MOVE CORRESPONDING di COBOL. Controlla se ti interessa abbastanza.

Ma quello più importante sono i linguaggi dinamici come Ruby e JavaScript che usano i dizionari per rappresentare le strutture. Il tipo di operazioni che descrivi sono comuni, ma implementate come funzioni di libreria piuttosto che come parole chiave nella lingua. Le assegnazioni vengono eseguite rigorosamente per corrispondenza del nome, indipendentemente dal tipo. Possono essere utilizzati (ad esempio) in Rails per spostare i bundle di attributi da una richiesta in entrata tramite la logica del programma all'accesso al database, il tutto per corrispondenza dei nomi.

    
risposta data 13.08.2014 - 17:14
fonte

Leggi altre domande sui tag