Code Review Fall 1

Ich habe für ein Unternehmen gearbeitet, dem es an Codeüberprüfungspraxis mangelt. Zur Selbstverbesserung und zur Erweiterung meines Horizonts möchte ich ein wenig konstruktive Kritik erhalten.

Jetzt schlage ich vor, den wiederkehrenden Fall mit einer Fülle von Zweigen zu analysieren.

Aufgabe


Der Benutzer beabsichtigt, die Datei mit der Maus von einem Ordnerfenster in ein anderes zu ziehen. Sie müssen eine Dispatcher-Methode schreiben, die das Wesentliche des Ereignisses und die Möglichkeit der Verarbeitung überprüft, bei Bedarf die Details klärt, dann die gewünschte Methode aufruft oder eine Meldung zu den Einschränkungen anzeigt.

Wenn der Benutzer per Drag & Drop von einem Ordner in einen Ordner zieht und sich ein anderer Ordner in einem anderen Abschnitt befindet, überprüfen Sie die Kopierbarkeit. Wenn Sie kopieren können, kopieren Sie. Andernfalls geben Sie eine Nachricht ein, die Sie nicht kopieren können. Es kann aus folgenden Gründen nicht kopiert werden: Es gibt keine Schreibberechtigung. nicht genug freier Speicherplatz; Das Dateisystem unterstützt keine Zeichen im Namen. Der Dateiname im Zielordner hat einen zu langen Pfad. Der Ordner enthält bereits eine gleichnamige Datei (öffnen Sie ein Dialogfeld, um die Datei zu überschreiben, wenn der Benutzer zustimmt, und überschreiben Sie sie).

Wenn sich der Zielordner auf derselben Partition wie die Datei befindet, verschieben Sie die Datei. Verschieben nicht möglich: Keine Schreibberechtigung; Der vollständige Zielpfad ist zu lang. Der Ordner enthält bereits eine gleichnamige Datei (Dialogfeld öffnen). Die Datei ist ein System und kann nicht gelöscht werden. Es gibt bereits eine Datei mit diesem Namen (öffnen Sie ein Dialogfeld, um die Datei zu überschreiben, wenn der Benutzer zustimmt, und überschreiben Sie sie).

Wenn der Benutzer die Datei in ein anderes Fenster verschoben hat, sie jedoch denselben Pfad hat, erstellen Sie eine Kopie der Datei (fügen Sie dem Namen "copy #" hinzu, wobei # die kleinste positive Zahl ist, die die Datei eindeutig macht). Kopie kann nicht erstellt werden: Keine Schreibberechtigung; der volle Weg ist zu lang; nicht genug freier Speicherplatz.

Wenn der Benutzer mit der rechten Taste übertragen hat, rufen Sie den Dialog auf, um die Aktion auszuwählen (Kopieren / Verschieben / Verknüpfung erstellen / Kopie erstellen).

Wenn der Benutzer die Datei mit der linken Schaltfläche im selben Fenster freigegeben hat (die Datei wurde beschädigt), tun Sie nichts. Und wenn ja, schlagen Sie vor, eine Kopie oder Verknüpfung zu erstellen. Wenn die Datei nicht in das Ordnerfenster fällt, tun Sie nichts.

Im Laufe der Zeit können neue Bedingungen auftreten, neue Aktionen und Bedingungen, die bereits zum Ändern von Aktionen beschrieben wurden, können sich ändern.

Diskussionslösung


Ich biete meine umstrittene Lösung in Java an, bei der ich die zweithöchste Verschachtelungsebene erreicht habe, wenn:

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


All Articles