4

16進数、10進数、2進数のコンバーターを作成していますが、これまでのところ順調に進んでいます。これはiPhoneでの私の2番目のプロジェクトであり、私は初心者です。しかし、私は自分が持っているもの(一連のifステートメント)をどのように単純化できるのか疑問に思いました。私は持っています:

if (entered is hex)
     if (binary button clicked)
         convert to binary
     if (decimal button clicked)
         convert to decimal
     else (hex button clicked)
         keep in hex and inform
else if (entered is binary)
     if (hex button clicked)
         convert to hex
     if (decimal button clicked)
         convert to decimal
     else (binary button clicked)
         keep in binary and inform user
else if (entered is decimal)
     if (hex button clicked)
         convert to binary
     if (binary button clicked)
         convert to hex
     else (decimal button clicked)
         keep in decimal and inform user    
else   
    give error if something else entered in 

これは私にはかなり繰り返しに見えます。これらはすべて1つのクラスにあり、ifステートメントはすべて互いに非常に似ているので、何かできることがあるかどうか疑問に思いました。

御時間ありがとうございます。

4

7 に答える 7

4

入力した値は常に同じ形式で(内部的に)保存します(この例では16進数を使用します)。次に、次のようなものを使用できます。これは、はるかに合理化されています。

// Convert the user entered value to hex
if (enteredValue is hex)
    internalHexValue = enteredValue
else if (entered is binary)
    internalHexValue = convert enteredValue (binary) to hex
else if (entered is decimal)
    internalHexValue = convert enteredValue (decimal) to hex
else
    error and return

// Now, you have far less repetition because you only have to convert from hex:
if (binary button clicked)
    convertedValue = convert internalHexValue to binary
else if (decimal button clicked)
    convertedValue = convert internalHexValue to decimal
else (hex button clicked)
    convertedValue = internalHexValue

// Lastly, see if they selected the same format for input and output:
if (enteredValue == convertedValue)
    inform user

上記の例を複数のメソッドに分割して、次のように記述して読みやすくすることもできます(わかりやすくするためにエラーチェックを削除しました)。

internalHexValue = [self convertEnteredValueToHex:enteredValue];
convertedValue   = [self convertHexValueToUserSelectedFormat:internalHexValue];
if (enteredValue == convertedValue)
    inform user

また、すべての「XXXからXXXへの変換」行をクラス内の異なるメソッドにします。

于 2013-02-16T04:27:41.773 に答える
1

それをいくつかの方法に分けてください。以下はかなり概念的なものであり、不必要な補充や括弧の欠如に対処していません。

    if (entered is hex)
        [self isHex];
    else if (entered is binary)
        [self isBinary];
    else if (entered is decimal)
        [self isDecimal];
        keep in decimal and inform user
    else
        give error if something else entered in
    return 0;
}

- (void)isHex {
    if (binary button clicked)
        convert to binary
    else if (decimal button clicked)
        convert to decimal
    else (hex button clicked)
        keep in hex and inform
}

- (void)isBinary {
    if (hex button clicked)
        convert to hex
    else if (decimal button clicked)
        convert to decimal
    else (binary button clicked)
        keep in binary and inform user
}

- (void)isDecimal {
    if (hex button clicked)
        convert to binary
    else if (binary button clicked)
        convert to hex
    else (decimal button clicked)
        keep in decimal and inform user
}
于 2013-02-16T03:48:06.540 に答える
1

スイッチを使用してください、それは非常にスムーズです、以下のようにしてください

switch (entered )
{
case hex:
     if (binary button clicked)
         convert to binary
     else if (decimal button clicked)
         convert to decimal
     else (hex button clicked)
         keep in hex and inform
break;

case binary:

     if (hex button clicked)
         convert to hex
     else if (decimal button clicked)
         convert to decimal
     else (binary button clicked)
         keep in binary and inform user
break;

case  decimal:

     if (hex button clicked)
         convert to binary
     else if (binary button clicked)
         convert to hex
     else (decimal button clicked)
         keep in decimal and inform user  
break;  

default:

    give error if something else entered in 
}
于 2013-02-16T03:36:48.823 に答える
1

あなたが言及したifステートメントは同じではありません。

たとえば、2進数ボタンを押したときに、数値を2進数に変換するには、2つの異なる関数が必要になります。

  1. 16進数から2進数(入力は16進数)
  2. 10進数から2進数(入力は10進数)

したがって、事実上、さまざまな関数を呼び出しています。

于 2013-02-16T04:23:19.550 に答える
1

@apurvが示すように、あなたの決定はユニークであり(入力+クリック)、それを単純化または粉砕するために実際に多くのことを行うことはできません(ある種の繰り返しパターンがあるかのように)。あなたができる最善のことはそれをできるだけ読みやすくすることです、そしてあなたが持っているものはちょうどいいです。理解するのはとても簡単です。これは、「単純化」したり、よりエレガントにしようとすると、おそらく不必要に複雑になり、読みにくくなる場合の1つです。

于 2013-02-16T04:43:34.863 に答える
1

代替案(必ずしも私のお気に入りではありません):

int inputFmt = <input format reduced to integer 0..2>
int outputFmt = <output format reduced to integer 0..2>

int switchValue = (inputFmt * 4) + outputFmt;

switch (switchValue) {
    case BinaryFmtConst * 4 + BinaryFmtConst:
        <convert binary -> binary>
        break;
    case BinaryFmtConst * 4 + DecimalFmtConst:
        <convert binary -> decimal>
        break;
. . .
    case DecimalFmtConst * 4 + BinaryFmtConst:
        <convert decimal -> binary>
        break;
. . .
    case HexFmtConst * 4 + HexFmtConst:
        <convert hex -> hex>
        break;
    default:
        <error message>
}
于 2013-02-17T13:31:54.187 に答える
0

読みやすくするためにswitchステートメントを使用してみませんか?

于 2013-02-16T03:18:02.420 に答える