Já pensou em utilizar paths, ao invés de diretivas de compilação, para compilar seu projeto em diferentes plataformas?
Photo by Nathan Dumlao on Unsplash
Em meados de 2017 eu escrevi um artigo sobre Diretivas de Compilação, explicando como poderíamos encapsulá-las para ajudar a tornar o código multiplatform.
Basicamente teríamos uma unidade comum a todas as plataformas (FPC e Delphi) e outra(s) unidade(s) específica(s) para cada uma delas.
Por exemplo: uma unidade FooFuncs
seria a principal enquanto FooFuncsFPC
e FooFuncsDelphi
seriam as especializadas.
A unidade FooFuncs
utilizaria as unidades especializadas e seus identificadores—interfaces e classes—seriam redefinidos utilizando uma nomenclatura mais genérica para toda a lib ou projeto e sem dependências com qualquer plataforma.
Após quase 2 anos, eu mudei esse conceito para um modelo que considero ainda mais simples e sem utilizar diretivas de compilação: utilização de apenas paths para cada plataforma.
Veja o projeto Xavier lib, por exemplo.
Dentro do diretório xavier/src/
podemos ver dois subdiretórios: fpc
e delphi
.
Cada diretório possui 1 unidade com o mesmo nome: XavierCorePlatform
.
Sabemos que um projeto não pode ter unidades duplicadas, então como isso funciona?
Basta aplicar o path por plataforma, ou seja, apenas 1 unidade será utilizada por projeto. Se você está utilizando o Delphi, irá utilizar apenas o path src\delphi
, por exemplo.
E é só isso.
As vantagens são visíveis em relação a abordagem anterior que utilizava diretivas:
- sem necessidade de diretivas de compilação
- não é necessário redeclarar identificadores de unidades especializadas
- não é necessário haver uma unidade genérica—ex:
FooFuncs
- basta 1 unidade por plataforma
- menos código
No entanto, você poderia considerar a (possível) duplicação de código como uma desvantagem, visto que haverá implementações de classes, com o mesmo nome, em unidades por plataforma. No projeto Xavier, por exemplo, vemos que há algumas linhas muito similares… mas isso não é um problema real.
A implementação por plataforma pode ser muito diferente uma da outra. Existir algumas linhas similares—ou mesmo iguais—é um preço mínimo a se pagar, na minha humilde opinião.
Finalmente, repare que todo código comum entre as plataformas devem estar em outras unidades compartilhadas. No caso do Xavier, tais códigos compartilhados estão nas unidades XavierCore
e XavierAdapters
. Ambas são utilizadas pelas unidades XavierCorePlatform
referente a cada plataforma.
Até logo.