Простой шифр Цезаря на языке Java


Я недавно новичок в Java и попытались создать простой шифр Цезаря (используя только строчные):

public class RunEncryption
{
    public static void main(String[] args)
    {
        SecretMessage test1 = new SecretMessage();
        test1.setMessage("hello");
        test1.display();
        test1.encrypt(1);
    }

}

Это мой класс с методом main в нем:

public class SecretMessage
{
    String message;

    void setMessage(String newMessage) {
        message=newMessage;
    }

    void display() {
        System.out.println(message);
    }

    void encrypt(int key) {
        int len = message.length();
        for(int i=0; i<len; i++) {
            char c = message.charAt(i);
            c = (char)(c+key);
            System.out.print(c);
        }
    }

}

Это работает, к счастью. Я получу оборачивать буквы. Но я хочу спросить, если есть что-нибудь, может быть, нетрадиционного об этом или если это неэффективный код. Любая помощь будет оценили, как я все еще новичок. Также, как долго это берет, чтобы сделать этот код? Он взял меня слишком долго.



1283
8
задан 3 февраля 2018 в 09:02 Источник Поделиться
Комментарии
2 ответа

Ничего необычного в ваш код, за исключением видимости, послание, которое, как правило, будет частная. Вашему шифрования метод откусил, как это просто печать при шифровании, может быть, вы могли бы назвать его printEncrypted или создать новый метод, который просто кодирует и сохраняет результаты в переменную..

Вы можете взять менее императивный подход, а также, это переписать метод, чтобы сделать то же самое, немного больше декларативный характер.

void encrypt( int key ) {
message.chars( )
.map( c -> c + key )
.forEach( c -> System.out.print( ( char ) c ) );
}

от: https://stackoverflow.com/questions/48601918/simple-caesar-cipher-java/48602653#48602653

6
ответ дан 3 февраля 2018 в 10:02 Источник Поделиться

ИМХО разделение вычисления и печати является наиболее важным улучшение делать.


  • Код, который не может сделать расчет отдельно-это просто выбрасывать мусор; вы не можете когда-либо использовать его для чего-либо еще.

  • Код, который не может сделать печать по отдельности бесполезно по той же причине. Вы не сможете использовать его ни для чего другого, даже не для расшифровки.

В простой сниппет это не имеет большого значения, но, узнав его позднее с сложные алгоритмы намного сложнее.


Обратите внимание асимметрия: ваш SecretMessage хранит открытым текстом, но не шифротекст. Спросите себя, если это нужно хранить что-либо.

Думаю об именах. Это SecretMessage действительно сообщение? Или это возможно Encryptor? Как вы реализовали его, ваших имен не плохо, но когда вы измените его, вы должны пересмотреть это.

Делает encrypt действительно зашифровать свой аргумент? Или вы ожидаете его сделать что-то еще? Может быть, более подробный с encryptWithKey(char key) имеет больше смысла.


Эффективность, как правило, переоценивают. Вы должны думать об использовании эффективных алгоритмов и структур данных для работы, но вы можете игнорировать почти все остальное. В любом случае, прежде чем приступить к оптимизации, убедитесь, что вы оптимизировать реальным "узким местом", т. е. профиль код.

В любом случае, используя System.out.print для одиночных символов могут замедлять вас вниз, как это синхронизировано и она сбрасывает выход.

Первое здание результат (используя StringBuilder) будет быстрее. Кроме того, это шаг в правильном направлении (разделение).

7
ответ дан 4 февраля 2018 в 12:02 Источник Поделиться