lundi 11 mars 2019

Design a trait which contains object of its type internally and choose at runtime what to use

In Scala, I am trying to design the following thing.

I have a hierarchy of Config objects. I have around 10 different subclasses of Config right now and this number will grow.

I want to create an interface Storage with two methods: add(c: Config): Unit and get(name: String): Config to be able to add/retrieve Config objects to an underlying storage (db, file, in-memory set, etc.).

Every ConfigImpl object needs to be stored in its own way: e.g. ConfigImplA objects will be stored in StorageImplA, ConfigImplB in StorageImplB, etc.

Basically every ConfigImpl sub-type has its own StorageImpl which is independent from the others.

Finally, I want to create a top-level component MultiStorage extends Storage class which contains internally a List[_ <: Storage] (with every Storage containing a single type of objects). The get of MultiStorage will try to fetch the Config from every Storage in the list in order, while the add will register a new c: Config in the storage 'storing' object of the same (sub)-type of c:

List[_ <: Storage] storages = List(storageA, storageB, storageC, ...) \\ this is externally configured 

def add(c: Config) = storages.find(s => typeOf[s] == typeOf[c]).get.add(c)       

As I explained here (Cannot get type of generic object in a list) I am having troubles with type management in this kind of situation. I would like to understand if the overall design of this thing is not ideal and I should approach it differently or if there is a way to properly play with types to implement a clean solution for this problem.

Aucun commentaire:

Enregistrer un commentaire