Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]pattern e esempio semplice

    Ciao.

    Sto iniziando a scrivere una libreria in c++ per il 3d.
    La prima fatica è stata lo scrivere una classe per i poligoni.

    Adesso devo creare un sistema per caricare/esportare poligoni sia in formato 3ds che maya.

    leggendo qua e la sui pattern(GoF ecc..) mi sono soffermato sulle definizioni in particolare
    del pattern abstract factory e factory method che semrano fare al caso mio.

    in particolare queste due definizioni mi sembrano azzeccate:


    Il pattern Factory Method definisce un’interfaccia di classe per la creazione di un oggetto,
    lasciando ai tipi derivati la decisione su quale oggetto debba essere effettivamente istanziato.
    Il pattern può rivelarsi utile quando una classe non è in grado di conoscere a priori il tipo di oggetti da creare
    piuttosto che quando si vuole delegare la creazione di un oggetto alle sottoclassi.
    L’applicazione del pattern consente di eliminare le dipendenze dai tipi concreti utilizzati.


    L’Abstract Factory (detto anche Kit) è un pattern creazionale che ha lo scopo di fornire un’interfaccia
    per la creazione di famiglie di oggetti tra loro correlati o dipendenti limitando l’accoppiamento
    derivante dall’uso diretto delle classi concrete. L’applicazione di questo pattern si rivela assai utile
    quando si vuole rendere un sistema indipendente dalle modalità di creazione,
    composizione e rappresentazione degli oggetti costituenti, rendendo note unicamente le interfacce e
    non le implementazioni concrete. Questo consente di rendere tra loro interscambiabili le diverse
    implementazioni che soddisfano una determinata interfaccia, senza che il contesto d’uso dell’istanza debba
    essere modificato al variare dell’implementazione scelta.

    le ho lette qui:
    http://msdn.microsoft.com/it-it/libr...67.aspx#ID0END

    leggendo l'abstract factory:
    "creazione di famiglie di oggetti tra loro correlati o dipendenti"

    non mi sembra il mio caso ,infatti non sono dipendenti i file 3ds da quelli maya
    e non mi serve "rendere un sistema indipendente dalle modalità di creazione"

    leggendo il factory method:
    utile quando una classe non è in grado di conoscere a priori il tipo di oggetti da creare

    non mi sebra necessario neppure questo.

    quindi avevo pensato di rendere tutto piu semplice creando una classe base astratta con i metodi load e save e
    eventuali altre ,CUtil3d ed ereditare due classi da questa , una c3ds e una c3dmaya.
    Infine istanziare o l'una o l'altra(e qui inizio a capire il factory method , infatti posso lasciare
    all' utente la scelta ,utente che è incapace di conoscere a priori il tipo di classe da istanziare , bo???)
    e chiamare i metodi save e load su una variabile di tipo cUtil3d istanziata come c3ds o c3dmaya , e
    tramite il polimorfismo lasciare automaticamente al tipo di classe la logica relativa al caricamento/esportazione
    non mi sembra pero' ,forse perche non la conosco ,di dovere applicare ad un caso cosi' semplice
    uno dei due pattern sopra indicati
    Insomma adesso chiedo a voi perchè sto iniziando a capire la oop ma applicarla è un altra storia
    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    Procedendo mi è venuto in mente un metodo diverso:
    dato che l'imortazione tratta gli stessi oggetti(materiali , shell , luci, vertici ,facce ecc..)in maniera diversa(un file 3ds è diverso da un file maya) ho pensato di procedere cosi:

    codice:
    Class C3ds:Creader
    {
      bool nextShell()
       {
          if(fineimportazioneshell)
           return false;
           else
           return true 
       }
      void importShell(CString shellid,CString material ecc...)
       {
          estraggo dal file con il procedimento che piu mi aggrada la shell corrente
    
        }
    }

    e una classe generale per tutti i formati con incapsulata una variabile CReader(pApi) specifica dell importatore scelto

    codice:
     Class CImportFile
       {
             for (pApi->nextSHell)
             {
                  CString strShellid,strMaterial;
                  pApi->ImportSHell(&shellid,&material)
                  {
                      inserisco nella mia classe poligono la shell , il materiale ecc...
                   }
             }
             pApi->ImportMaterial()
             
       }
    In questo modo una volta che si sceglie il tipo di file da importare si lascia la logica all implementazione del creader(C3ds,cMaya ecc...)
    Il problema ed è quello per cui sto postando è che questa logica si presta bene all'importazione dati da un database , in cui posso sapere in maniera semplice il numero di oggetti da importare e il "titrare fuori i dati" per quel tipo di oggetti .
    In un file come ad es. 3ds la logica del tirare fuori i dati è un po piu complessa , il file deve essere attraversato tutto per leggere i dati e il tornare indietro mi sembra una brutta pratica.
    Potrei usare degli array per memorizzare i vari tipi di oggetto in maniera grezza e poi raffinare l'estrazione nel Creader.
    insomma , mi sembra che il mio metodo mal si presti ai file sequenziali.
    Voi cosa mi consigliate?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.