# Consiglio sul design di un'estensione

**URL:** <https://www.ruby-forum.com/t/consiglio-sul-design-di-unestensione/117274>\
**Category:** IT\
**Created:** [October 15, 2007, 3:35pm UTC](https://www.ruby-forum.com/t/consiglio-sul-design-di-unestensione/117274 "2007-10-15T15:35:31Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Domenico\_Delle\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Domenico\_Delle\_S](https://www.ruby-forum.com/u/Domenico_Delle_S)\
**Post date:** [October 15, 2007, 3:35pm UTC](https://www.ruby-forum.com/t/consiglio-sul-design-di-unestensione/117274/1 "2007-10-15T15:35:31Z")

</div>

Ciao,

mi sto accingendo a scrivere un’estensione per ruby (ripod) che  
implementi  
i binding per la libreria libgpod e mi trovo davanti ad una scelta di  
design sulla quale vorrei un consiglio.

La libreria consente di accedere al database iTunesDB, leggerlo,  
modificarlo, aggiungere canzoni, miniature, playlist (consente anche di  
accedere al database delle foto, ma di quello mi occuperò in seguito).

Per aggiungere una canzone, ad esempio, è comunque sià necessario aprire  
il database dell’ipod, atto attraverso il quale si ottiene una struttura  
dati itdb\_iTunesDB, e passare tale struttura come argomento della  
funzione  
che si occupa di fare la magia.

Per questo motivo, ho pensato di realizzare una classe Ripod dove si  
trovano i metodi per aggiungere/rimuovere/modificare canzoni, miniature  
e  
playlist, e poi delle sottoclassi Ripod::Track, Ripod::Playlist e  
Ripod::ArtWork che si occupino di contenere i dati relativi. Un qualcosa  
del tipo:

Ripod#track\_add(Ripod::Track track)  
#track\_remove  
…  
Ripod#artwork\_add(Ripod::ArtWork artwork)  
#artwork\_remove  
…  
Ripod#playlist\_add(Ripod::Playlist playlist)  
#playlist\_remove

ecc…

Il problema è che non sono convinto che questa sia la migliore scelta,  
pertanto volevo sentire anche il vostro parere.

Ciao,  
Nico

---

<div class="post-metadata">

**Author:** ![Domenico\_Delle\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Domenico\_Delle\_S](https://www.ruby-forum.com/u/Domenico_Delle_S)\
**Post date:** [October 15, 2007, 3:45pm UTC](https://www.ruby-forum.com/t/consiglio-sul-design-di-unestensione/117274/2 "2007-10-15T15:45:29Z")

</div>

Il giorno lun, 15/10/2007 alle 15.34 +0200, Domenico Delle S. ha  
scritto:

> Per aggiungere una canzone, ad esempio, Ã¨ comunque siÃ necessario aprire  
> Ripod#track\_add(Ripod::Track track)  
> Il problema Ã¨ che non sono convinto che questa sia la migliore scelta,  
> pertanto volevo sentire anche il vostro parere.

Secondo me e’ la scelta azzeccata, poi magari guardati i bindings per  
python per “rubare” qualche idea

---

<div class="post-metadata">

**Author:** ![Domenico\_Delle\_S](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/7ba0ec/32.png) [@Domenico\_Delle\_S](https://www.ruby-forum.com/u/Domenico_Delle_S)\
**Post date:** [October 15, 2007, 8:19pm UTC](https://www.ruby-forum.com/t/consiglio-sul-design-di-unestensione/117274/3 "2007-10-15T20:19:47Z")

</div>

— Domenico Delle S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ```
> #track_remove
> 
> ```
> 
> …  
> Ripod#artwork\_add(Ripod::ArtWork artwork)  
> #artwork\_remove  
> …  
> Ripod#playlist\_add(Ripod::Playlist playlist)  
> #playlist\_remove
> 
> ecc…

Hai pensato a usare un classico duble dispatch?  
Inverti l’idea:  
Playlist.add\_to(db)  
Track.add\_to(db)  
ArtWork.add\_to(db)

Tanto queste richimano ognuna una funzione C diversa.  
Poi definisci #add nella classe Ipod come una semplice  
def add(obj)  
obj.add\_to(self)  
end

e lo stesso per remove. Che ne pensi?

–  
Goto 10: [http://www.goto10.it](http://www.goto10.it)  
blog it: [http://riffraff.blogsome.com](http://riffraff.blogsome.com)  
blog en: [http://www.riffraff.info](http://www.riffraff.info)

```
  ___________________________________________________________

```

Yahoo! Answers - Got a question? Someone out there knows the answer. Try  
it  
now.

> **[Yahoo | Mail, Weather, Search, Politics, News, Finance, Sports & Videos](https://www.yahoo.com/)**
>
> Latest news coverage, email, free stock quotes, live scores and video are just the beginning. Discover more every day at Yahoo!
