- História do open file renamer
- Arquitetura
- Instruções para desenvolvimento
- Post mortem
Queremos uma aplicação que dê uma ferramenta gratuita e de código aberto para auxiliar operações comuns do dia a dia de quem precisa organizar uma grande quantidades de arquivos.
[Download](https://drive.google.com/file/d/155v-SYu8Wtzxqv2hS4F0Yms0r-RD_5Ul/view?usp=sharing)
Sua arquitetura foi planejada para ter um backend que comporte várias interfaces de usuário pertencentes á linguagem C# e .NET, todas as respostas da camada de presentação devem ser entregues pela camada de serviço e a camada de serviço se comunica e organiza todos os micro-serviços.
– Services “Serviços que fazem a orquestração de solicitações da presentação e micro-serviços”
— Contracts “Contratos de comunicação que devem ser atendidos pela camada de presentação”
— DAO “Objetos de acessos á dados, aqui se delega o máximo que se pode de lógica utilizada nos componentes da presentação”
— DTO “Classes magras utilizadas para armazenar estrutura de dados comuns”
— Enum “Páginas do tipo Enum”
— Interfaces “Interfaces utilizadas na camada de serviço e presentação”
— Value Objects “Objetos imutáveis que estabelecem a linguagem ubiqua para símbolos utilizados no projeto”
– File Manager “Aqui deve ficar páginas cujo a chamada pertence á serviços externos”
— DAO “Objetos que fazem acesso á dados externos”
— DirectoryOperations “Operações destinados apenas á leitura de diretórios”
— File Operations “Operações que modificam arquivos físicos”
— — Append “Adicionar caracteres”
— — NumberedSequence “Sequencia numérica”
— — Pattern “Padrão de substituição de caracteres”
— — Remove “Remoção de caracteres”
— Interfaces “Interfaces”
O acesso de arquivos físicos deve ser feito através da classe FileManager.DAO.FileIdentity, o acesso deve ser uma única fonte da verdade e imutável, desta forma será possível facilitar as operações de rollback , renomeação de arquivos e leitura.
É importante notar que a classe FileIdentity deve ser interpretada como uma identidade única para o arquivo antes e depois de modificar seu nome, enquanto ainda estiver no mesmo diretório, desta forma será possível encontrá-lo para retornar á sua última versão.
A pratica de utilização de ValueObjects vai evitar sinónimos e vários bugs durante o processo de desenvolvimento.
( referencias "Desenvolvimento guiado por testes TDD, Kent Beck ISBN 978-85-7780-747-5 ")
Novas operações de renomeação devem utilizar-se da classe base : FileManager.FileOperations.FileProcessor, a classe utiliza o padrão GOF "Strategy" e é implementada á classe FileManager.FileOperations.FileWriter.
O método abstrato GetRenameTo() deve retornar o novo nome de arquivo que será implementado em preview, renomeação e rollback de nome de arquivo, adicione ao construtor desta classe as dependencias da classe pai e demais variáveis necessárias para construir o novo nome do arquivo.
Importante : Utilize os atributes da classe pai “FileNameBefore” e “FileExtensionBefore” para reconstruir o nome do arquivo.
A classe FileManager.FileManagerService deve implementar todas as operações que estão expostas á camada de serviço, Operações de Leitura de arquivos devem estar contidas na interface IDirectoryReader e Operações relacionadas ao versionamento de arquivos na interface IVersionControl.
Note que todas as operações que modificam o nome de arquivos estão isentas de interface mas são intermediadas pela interface IMementoFileManager, que implementa o Design Pattern GOF Memento para armazenar a última modificação de arquivo feita.
Agora faça a implementação necessária para utilizar o serviço na camada de serviço, pode-se utilizar das implementações já existentes ou delegar da forma que for necessário a camada de presentação.
Implemente novos tipos de filtros enviando um evento para o método privado : searchFilter_Changed da classe Presentation.Main,
adicione um novo tipo de Enum em ApplicationService.Enum.Main_SearchFilter e implemente uma nova leitura de diretórios no projeto FileManager com a interface FileManager.Interfaces.IDirectoryReader
ITabControlWrapper :Interface que recebe todas as Tabs de file preview e rename e envia um IOperationContract para a camada de serviço retornar a operação de preview ou rename de arquivos.
ITabControl : Interface que é utilizada na design pattern Strategy com finalidade de delegar a opções escolhidas de reanomeação de arquivo e convertelas para a interface IOperationContract
IOperationContract : É o contralo estabelecido para organizar os dados necessários para solicitar uma utilização de renomeação de arquivos fornecida pela camada de serviço, todas as chamadas de file rename devem implementar esta interface.
A implementação atual envia o nome do diretório e refaz a ultima operação armazenada no memento do File Manager
Todas as operações que modificam arquivos devem passar pelo Memento antes de serem iniciadas, isto inclui também operações de Rollback.
Operações referentes á apenas leitura de arquivos podem ser isoladas em uma classe separada e não precisam passar pelo memento.
Após a conclusão do projeto foi possível ver problemas comuns em projetos pequenos com a finalidade de leitura e escrita de arquivos.
Planejamento para varias interfaces de usuário :
Foi possível verificar que embora a leitura e escrita de arquivos utiliza-se uma classe comum para abstrair suas funcionalidade de alto nível, a implementação carece de formas de substituir sua implementação, desta forma não foi possível trocar o metodo de acesso á dados sem comprometer todos as implementações já existentes.
Isto foi notado após implementar toda a interface com .NET Maui e ter debugado apenas no windows, quando depurado em android, já não é mais possível ler ou modificar arquivos com a mesma classe FileInfo e DirectoryInfo.
Delegar parte da logica da interface de usuário para a camada de serviço :
A camada de serviço ao decorrer do projeto acabou fazendo parte da lógica de delegação de dados da interface de usuário,
desta forma a interface do .NET Maui já nasceu com um modelo para ser atendido.
Modificação de última hora na forma de ler arquivos :
O projeto iniciou com o acesso á leitura de arquivos com uma única fonte da verdade (SSOT), e foi possível de última hora definir a Identidade do arquivo como uma TimeStamp em vez do nome completo do arquivo e diretório, isto permitiu implementar o rollback de versão com um ponto negativo: modificando a data de criação do arquivo para criar uma identidade única para este arquivo com TimeStamp.Ticks .
Implementação de UI com tecnologia .NET MAUI
Foi iniciado os estudos de implementação de uma interface multi aplicação com a tecnologia .NET MAUI na versão .NET 9 community ToolKit e visual Studio 2022 Preview.
Embora o projeto estivesse funcionando normalmente na versão Windows não foi possível publicar a pacote MSIX, havendo diversos bugs relatados na internet sobre a dificuldade de publicação para a Microsoft Partner.