Revisión de código caso 1

Trabajé para una empresa que carece de práctica de revisión de código. Para mejorarme y ampliar mis horizontes, me gustaría recibir un poco de crítica constructiva.

Ahora propongo analizar el caso recurrente con una gran cantidad de ramas.

Tarea


El usuario intenta arrastrar el archivo con el mouse de una ventana de carpeta a otra. Debe escribir un método de despachador que verifique la esencia del evento y la posibilidad de procesarlo, si es necesario, aclara los detalles, luego llama al método deseado o muestra un mensaje sobre las restricciones.

Si el usuario arrastra y suelta de una carpeta a una carpeta y otra carpeta está en una sección diferente, compruebe la capacidad de copia. Si puedes copiar, entonces copia. De lo contrario, envíe un mensaje que no pueda copiar. No se puede copiar por razones: no hay permiso de escritura; no hay suficiente espacio libre; el sistema de archivos no admite caracteres en el nombre; el nombre del archivo en la carpeta de destino tendrá una ruta demasiado larga; ya hay un archivo con el mismo nombre en la carpeta (abra un cuadro de diálogo para sobrescribir el archivo, si el usuario está de acuerdo, luego sobrescriba).

Si la carpeta de destino está en la misma partición que el archivo, mueva el archivo. No se puede mover: sin permisos de escritura; la ruta de destino completa será demasiado larga, ya hay un archivo con el mismo nombre en la carpeta (abra un cuadro de diálogo); el archivo es el sistema y no se puede eliminar; ya hay un archivo con ese nombre (abra un cuadro de diálogo para sobrescribir el archivo, si el usuario está de acuerdo, luego sobrescriba).

Si el usuario movió el archivo a otra ventana, pero tiene la misma ruta, cree una copia del archivo (Agregue "copia #" al nombre, donde # es el número positivo más pequeño que hace que el archivo sea único). No se puede crear una copia: no hay permisos de escritura; el camino completo es demasiado largo; No hay suficiente espacio libre.

Si el usuario transfirió con el botón derecho, llame al cuadro de diálogo para seleccionar la acción (copiar / mover / crear acceso directo / crear copia).

Si el usuario lanzó el archivo en la misma ventana (el archivo se corrompió) con el botón izquierdo, no haga nada. Y si es correcto, sugiera crear una copia o acceso directo. Si el archivo no cae en la ventana de la carpeta, no haga nada.

Con el tiempo, pueden aparecer nuevas condiciones, nuevas acciones, las condiciones ya descritas para cambiar las acciones pueden cambiar.

Solución de discusión


Ofrezco mi controvertida solución en Java, en la que alcancé el segundo nivel más alto de anidación si:

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/es417903/


All Articles