Помощник, который проведет методы оценки и расчета данных


Я хотел бы несколько советов, чтобы сократить этот фрагмент, придать ему более эффективный поток и смотреть. Анализ должен быть направлен на сохранение его в качестве компактного один способ (кроме двух государственных реквизит). Этот тип данных и MeasureStatus является перечисление. Читабельность-это, конечно, важнее, чем компактность.

....
/// <summary>
/// Helper that hold methods for evaluate and calculate data 
/// that will be serialized/deserialized in Serializer/SerializerBase.
/// Please don't put serializing routines in here and also understand 
/// that some decisions here are based on protocol specifikations.
/// </summary>
....
public Unit MeasureType { get; set; }
public ModeType Aggregate { get; set; }
.....

public Tuple<DataType, byte> EvaluateDataType(double value, MeasureStatus? status = null)
{
    int quantityOfDecimals = 0;
    DataType dataType = DataType.MISSING_LONG;
    byte nibbled = 0;
    bool statusIsMissing = false;

    if (status != null)
        if (status == MeasureStatus.Missing)
            statusIsMissing = true;

    quantityOfDecimals = 
      (this.MeasureType == Unit.kWh || this.MeasureType == Unit.ºC) ? 1 : 2;

    // Qty decimals affect limit size  of 'value'
    if (quantityOfDecimals == 1)
    {
        if (value < 3276 && value > -3276)
            if (!statusIsMissing)
                dataType = DataType.SHORT_1DEC;
            else
                dataType = DataType.MISSING_SHORT;
        else
            if (!statusIsMissing)
                dataType = DataType.LONG_1DEC;
            else
                dataType = DataType.MISSING_LONG;
    }

    // Qty decimals affect limit size  of 'value'
    if (quantityOfDecimals == 2)
    {
        if (value < 327 && value > -327)
            if (!statusIsMissing)
                dataType = DataType.SHORT_2DEC;
            else
                dataType = DataType.MISSING_SHORT;
        else
            if (!statusIsMissing)
                dataType = DataType.LONG_2DEC;
            else
                dataType = DataType.MISSING_LONG;
    }

    nibbled = (byte)(Aggregate | dataType);
    return new Tuple<DataType, byte>(dataType, nibbled);
}


322
2
задан 25 ноября 2011 в 11:11 Источник Поделиться
Комментарии
1 ответ

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

public Tuple<DataType, byte> EvaluateDataType(double value, MeasureStatus? status = null) 
{

// As much as possible, initialize a local variable to the proper value
// when you declare it (as if it had Java's *final* attatched).
// This isn't always possible, of course
DataType dataType;
// Really, these are the only two datatypes that use 1 decimal place?
int decimalPlaces = (MeasureType == Unit.kWh || MeasureType == Unit.ºC) ? 1 : 2;
// Structure your code so that it's values and executions give the -reasons-
// or the -why-. The code itself says -what- is happening, but it's usually -why-
// that's actually important.
// Among other things, this means you should (usually) avoid magic numbers.
bool valueOutOfRange = Math.Abs(value) >= (Int16.MaxValue / (10 * decimalPlaces));

// status == null is considered -present-?
if (status != null && status == MeasureStatus.Missing)
{
// Note, never leave off brackets - {} - you run a nasty risk of
// someone writing indented code that isn't actually part of the block.
// Also, as much as possible, test for -affirmative- results, not negative ones.
// Although, multiple negatives should still be avoided.
if (valueOutOfRange)
{
dataType = DataType.MISSING_LONG;
}
else
{
dataType = DataType.MISSING_SHORT;
}
}
else
{
if (valueOutOfRange)
{
if (decimalPlaces == 1)
{
dataType = DataType.LONG_1DEC;
}
else
{
dataType = DataType.LONG_2DEC;
}
}
else
{
if (decimalPlaces == 1)
{
dataType = DataType.SHORT_1DEC;
}
else
}
dataType = DataType.SHORT_2DEC;
}
}
}

// Are you sure you don't mean "byte nibbled = (byte) (Aggregate & dataType);"?
// I'm assuming you're attempting to mask Aggregate for the cast, and that
// you haven't done anything -too- out there in the operator override.
byte nibbled = (byte) (Aggregate | dataType);
return new Tuple<DataType, byte>(dataType, nibbled);
}

Хотя, я немного с подозрением отношусь ко всему, что движется какой-то тип примерно такой (тем более, что вы только сохраняете в байт). Как правило, лучше предпочесть какой-то реализован универсальный, так что вы можете получить время компиляции проверка типов данных. Ничего подобного несоответствия во времени выполнения, чтобы разбить свой зонд на Марс (при условии, что несоответствие в типе измерения, которой вы пытаетесь покрыть здесь. Однако, вам все-таки нужно разобраться со значением МИС-матчи...).

3
ответ дан 25 ноября 2011 в 07:11 Источник Поделиться