Caso 1 de Revisão de Código

Eu trabalhei para uma empresa que não tem prática de revisão de código. Para o auto-aperfeiçoamento e a ampliação de meus horizontes, gostaria de receber algumas críticas construtivas.

Agora, proponho analisar o caso recorrente com uma abundância de ramos.

Tarefa


O usuário pretende arrastar o arquivo com o mouse de uma janela de pasta para outra. Você precisa escrever um método despachante que verifique a essência do evento e a possibilidade de processá-lo, se necessário, esclarecer os detalhes, depois chamar o método desejado ou exibir uma mensagem sobre as restrições.

Se o usuário arrastar e soltar de uma pasta para outra e outra pasta estiver em uma seção diferente, verifique a capacidade de cópia. Se você pode copiar, copie. Caso contrário, dê uma mensagem que você não pode copiar. Não pode ser copiado por razões: não há permissão de gravação; espaço livre insuficiente; o sistema de arquivos não suporta caracteres no nome; o nome do arquivo na pasta de destino terá um caminho muito longo; já existe um arquivo com o mesmo nome na pasta (abra uma caixa de diálogo para substituir o arquivo, se o usuário concordar, substitua-o).

Se a pasta de destino estiver na mesma partição que o arquivo, mova o arquivo. Não foi possível mover: nenhuma permissão de gravação; o caminho de destino completo será muito longo, já existe um arquivo com o mesmo nome na pasta (abra uma caixa de diálogo); o arquivo é sistema e não pode ser excluído; já existe um arquivo com esse nome (abra uma caixa de diálogo para substituir o arquivo, se o usuário concordar, em seguida, substitua).

Se o usuário moveu o arquivo para outra janela, mas possui o mesmo caminho, crie uma cópia do arquivo (adicione "copy #" ao nome, onde # é o menor número positivo que torna o arquivo exclusivo). Não foi possível criar a cópia: sem permissões de gravação; o caminho completo é muito longo; espaço livre insuficiente.

Se o usuário transferiu com o botão direito, chame a caixa de diálogo para selecionar a ação (copiar / mover / criar atalho / criar cópia).

Se o usuário lançou o arquivo na mesma janela (o arquivo foi corrompido) com o botão esquerdo, não faça nada. E se estiver certo, sugira a criação de uma cópia ou atalho. Se o arquivo não cair na janela da pasta, não faça nada.

Com o tempo, novas condições podem aparecer, novas ações, condições já descritas para alterar ações podem mudar.

Solução para discussão


Ofereço minha solução controversa em Java, na qual atingi o segundo nível mais alto de aninhamento se:

public static void dispatchFileDropping( FileDragNDropEvent event ) { //------------------------------------------------------ //   // (     ). boolean A = isTargetPlaceIsDirectoryWindow(event); boolean B = isTargetDirEqualsSourceDir(event); boolean C = isTargetVolumeEqualsSourceVolume(event); boolean D = isMouseRightButtonUsed(event); boolean E = isSystemFileDroped(event); boolean F = isTargetVolumeHasFreeSpace(event); boolean G = isTargetDirWritable(event); boolean H = isSourceDirCleanable(event); boolean I = isFileNameOkForTarget(event); boolean J = isNewFileFullPathOkForTargetLimit(event); boolean K = isTargetDirHasSameNamedFile(event); boolean L = isTargetDirSameNamedFileIsWritable(event); Actions userChoise = (A & D) ? askUserForAction(event) : null; if (userChoise == Actions.CANCEL) return; boolean M = (userChoise == Actions.COPY); boolean N = (userChoise == Actions.CLONE); boolean O = (userChoise == Actions.MOVE); boolean P = (userChoise == Actions.LINK); //------------------------------------------------------ //      . boolean copyCase = (M & !K) | (A & !B & !C & !D & !K); boolean copyRewriteCase = (M & K) | (A & !B & !C & !D & K); boolean cloneCase = N | (A & B & !D); boolean moveCase = (O & !K) | (A & !B & C & !D & !K); boolean moveRewriteCase = (O & K) | (A & !B & C & !D & K); boolean createLinkCase = P; //------------------------------------------------------ //      //  . if (copyRewriteCase | moveRewriteCase) { if (askUserWantToRewrite() == Answers.NO) return; } //------------------------------------------------------ //     . boolean isPossibleToCopy = F & G & I & J; boolean isPossibleToCopyRewrite = isPossibleToCopy & L; boolean isPossibleToClone = isPossibleToCopy; boolean isPossibleToMove = isPossibleToCopy & !E & H; boolean isPossibleToMoveRewrite = isPossibleToMove & L; boolean isPossibleToLink = isPossibleToCopy & !K; //------------------------------------------------------ //   ,  , //    . String errorMessage = ""; if (copyCase & !isPossibleToCopy) { errorMessage = "  ."; } else if (copyRewriteCase & !isPossibleToCopyRewrite) { errorMessage = "  ."; } else if (cloneCase & !isPossibleToClone) { errorMessage = "  ."; } else if (moveCase & !isPossibleToMove) { errorMessage = "  ."; } else if (moveRewriteCase & !isPossibleToMoveRewrite) { errorMessage = "    ."; } else if (createLinkCase & !isPossibleToLink) { errorMessage = "  ."; } String reasons = " : \n"; if (!F) { reasons += "--     \n"; } if (!G) { reasons += "--        \n"; } if (!I) { reasons += "--      \n"; } if (!J) { reasons += "--       \n"; } if (moveCase | moveRewriteCase) { if (E) { reasons += "--     \n"; } if (!H) { reasons += "--       \n"; } } else if (copyRewriteCase | moveRewriteCase) { if (!L) { reasons += "--      \n"; } } else if (createLinkCase) { if (K) { reasons += "--       \n"; } } if (errorMessage.isEmpty()) { if (copyCase) copy(event); if (copyRewriteCase) copyRewrite(event); if (cloneCase) clone(event); if (moveCase) move(event); if (moveRewriteCase) moveRewrite(event); if (createLinkCase) createLink(event); } else { showMessage(errorMessage + reasons); } } 

Source: https://habr.com/ru/post/pt417903/


All Articles