Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Melhoria de código com String

Boa tarde, eu tenho uma interface (IPrinter) que possui seu métodos e varias classes que implementam IPrinter, onde cada classe seria um modelo de impressora, existe uma classe management que faz o gerenciamento, ela lê um arquivo XML que contém o nome da impressora que irá utilizar, de acordo com o nome tem um switch case que compara a string do XML com o nome das classes para poder instanciar a impressora certa.

Gostaria de saber como poderia melhorar este código para não ficar com varios Switch Cases, pois existe cerca de 30 modelos de impressoras.

3 respostas

Pelo que entendi cada impressora implementa IPrinter, você poderia ter uma Abstract class que implementa a IPrinter e nesta classe abstrata um construtor que recebe o nome da impressora (ou um método que pega ele de outro lugar privado) e um getName que vai ser usado pelo gerenciador de impressoras, então cada implementação de impressora saberia seu nome e não precisaria de switch pois o gerenciador apenas pediria para a impressora qual o seu nome.

Mas ainda assim teria uma verificação para saber qual impressora instanciar ou não?

Hoje esta mais ou menos assim, só que com 30 opções...:

switch (config.printer.driver.ToUpper())
                    {
                        case "CIMMAXIMA861PRINTER":
                            printerServices = new CimMaxima861Printer.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARD150IPRINTER":
                            printerServices = new Datacard150iPrinter.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARD280PPRINTER":
                            printerServices = new Datacard280pPrinter.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARD450PRINTER":
                            printerServices = new Datacard450Printer.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARDCD800PRINTER":
                            printerServices = new DatacardCD800Printer.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARDCD820PRINTER":
                            printerServices = new DatacardCD820Printer.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARDCE840PRINTER":
                            printerServices = new DatacardCE840Printer.PrinterServicesImpl(config.printer);
                            break;
                        case "DATACARDCE870PRINTER":
                            printerServices = new DatacardCE870Printer.PrinterServicesImpl(config.printer);
                            break;
            default:
                            throw new Exception("No driver found for: " + config.printer.driver.ToUpper());
solução!

Fala, Ricardo. Beleza!?

Dá uma pesquisada sobre Reflection. Com isso, a partir do nome da classe numa string, você consegue instanciá-la.

Exemplo:

MyClass myInstance = (MyClass) Class.forName("MyClass").newInstance();

Espero ter ajudado.

Abraços!