-1

そのため、キーワードを使用してメッセージをエンコードまたはデコードできるプログラムを作成しています。エンコーディング部分はダウンしていますが、メッセージをデコードする方法がわかりません。私はJavaが初めてなので、助けていただければ幸いです。

これまでの私のコードは次のとおりです。

            import java.util.Scanner;

            class Coder
            {
              public static void main(String[] arg)
             {
                boolean encode = false;
                boolean decode = false;
                int multi = 1;
                Scanner inputdata=new Scanner(System.in);
                System.out.print("Type E to encode or D to decode:\n");
                String opt=inputdata.nextLine();
                if (opt.equals("e")||opt.equals("E"))
                {
                    System.out.print("Type the keyword to use for encoding:\n");
                    encode = true;
                }
                else if (opt.equals("d")||opt.equals("D"))
                {
                    System.out.print("Type the keyword for decoding:\n");
                    decode = true;
                }
                else
                {
                    System.out.print("Error:This is not an option");
                }


                if (encode==true)
                {
                    String keyword=inputdata.nextLine();
                    int[] key = new int[1000];
                    for (int k = 0; k < key.length; ++k)
                    {
                        char c = keyword.charAt(k % keyword.length());
                        if (c >= 'a' && c <= 'z')
                        {
                            key[k] = c-'a';
                        }
                    }
                    System.out.print("Type encode message:\n");
                    String message=inputdata.nextLine();
                    for (int i = 0; i < message.length(); ++i)
                    {

                        if (message.charAt(i) >= 'a' && message.charAt(i) <= 'z')
                        {
                            System.out.println((int)message.charAt(i) - (int)'a' + key[i]);
                        }
                        else if (message.charAt(i) >= 'A' && message.charAt(i) <= 'Z')
                        {
                            System.out.println((int)message.charAt(i) - (int)'A' + key[i]);
                        }
                        else if (message.charAt(i) == ' ')
                        {
                            System.out.println(" ");
                        }
                        else
                        {
                            System.out.println(message.charAt(i));
                        }
                    }
                }


                if (decode==true)
                {

                }
                }
            }
4

2 に答える 2

1

さて、あなたが書こうとしている暗号化/復号化アルゴリズムの種類はわかりませんが、ある種の ROT シャッフルのようです。私の最善の推測は、リーの答えの行に沿っているでしょうが、正直なところ、私はあなたのコードを本当に消化していませんでした. main 関数内のすべてと if 条件で読むのは非常に困難です。

Java を初めて使用する方もいらっしゃると思いますが、ここでは、生活を楽にするための役立つプラクティスとコード設計のヒントを紹介します。

JUnit はあなたの友達です:

main メソッド内でコードを実行してデバッグするのは、本当に悪い考えです。コードを調べるたびに、各シナリオを手動で実行し、プログラムの現在の状態を調べる必要があります。すべての作業を行うテスト プログラムを作成できます。さらに、特定の条件を検査する必要がある場合に、デバッガーにジャンプするのが簡単になります。

JUnit は Java に組み込まれていますが、Hamcrest や Mockito など、より簡単に操作できるライブラリが他にもあります。

たとえば、これにはすべて基本的なテストが必要です。

public class EncryptionTest {
    @Test // Test annotation marks that this method should be evaluated
    public testEncoding() {
          final String orginalString = "fooBar";
          final String expectedEncryptionResults = "barFoo"; // You should get the point.

          final String encryptedString = Encoder.encode(oringalString) 

// Or however you want to structure the encoder object.

          assertTrue( encryptedString.equals( expectedEncryptionResults ) );
          // If false, the test will fail.                                                               
    }
} 

デザインパターン

心に留めておくべき良い経験則は、ウィキペディア: デメテルの法則です。簡単に言えば、このルールは、メソッドまたはオブジェクトが必要以上に知っている必要があることを示しています。

ユーティリティ

使いやすいデザインパターンはユーティリティパターンです。

public class Encoder {
    private Encoder() {} // Private constructor

    public static encode( final String message ) {
        String encodedMessage = null
        // Complex encryption magic goes here
        return encodedMessage;
    }
}

このパターンにはプライベート コンストラクターがあるため、Encoder オブジェクトをインスタンス化することはできず、その中で定義された静的メソッドのみを使用できます。これは、共通のロジックやチェックを再利用する良い方法です。Apache Utitls クラスは、Utility パターンの優れた例です。

そのため、私の Junit デモでは、この Encoder クラスも使用しました。

final String encryptedString = Encoder.encode(oringalString) 

工場

ファクトリは、もう 1 つの一般的で使いやすい設計パターンです。工場は、他のオブジェクトを作成するという人生の 1 つの目標を持つ単純なオブジェクトです。

public class EncryptionFactory {
     public String build( String message ) {
         // Complex magic goes here.
         return encryptedString;
     }
}

public class EncryptionFactoryTest {

    final EncryptionFactory factory = new EncryptionFactory();
     
     @Test
     public void testEncryption() {
            final String = originalMessage = "fooBar";
            
            final String encryptedMessage = factory.build(originalMessage);

            assertTrue( encryptedMessage.equals("barFoo") );
     }
}

設計パターンを使用する主な利点は、暗号化アルゴリズムなどの実装ロジックをコードの小さなセグメントにプッシュすることで、再利用とエラーの発見が容易になることです。さらに、開発とメンテナンスの時間も短縮されます ^_^

于 2013-05-09T19:56:30.000 に答える