За что я готов забить гвоздь в голову.

Dec 10, 2009 15:10

Вот тут наткнулся на креатив коллег из Гонконга:

if (_limitPrice.Value.HasValue)
{
double percent = 0;
if (MarketData.MarketData[MarketDataField.Last.Value] != null)
{
if (double.TryParse(AppSettingService.GetString("WarningPercent", null), out percent))
{
double diff = ((_limitPrice.Value.Value - (double)MarketData.MarketData[MarketDataField.Last.Value]) / (double)MarketData.MarketData[MarketDataField.Last.Value]) * 100;
if (Math.Abs(diff) > percent)
{
errorText += "Limit price deviates from the last price by " + percent + "%\r\n";
}
}
}
else
{
if (side.Equals(Side.Buy))
{
if (MarketData.MarketData[MarketDataField.Bid.Value] != null)
{
if (double.TryParse(AppSettingService.GetString("WarningPercent", null), out percent))
{
double diff = ((_limitPrice.Value.Value - (double)MarketData.MarketData[MarketDataField.Bid.Value]) / (double)MarketData.MarketData[MarketDataField.Bid.Value]) * 100;
if (Math.Abs(diff) > percent)
{
errorText += "Limit Price deviates from the bid price by " + percent + "%\r\n";
}
}
}
}
else
{
if (MarketData.MarketData[MarketDataField.Ask.Value] != null)
{
if (double.TryParse(AppSettingService.GetString("WarningPercent", null), out percent))
{
double diff = ((_limitPrice.Value.Value - (double)MarketData.MarketData[MarketDataField.Ask.Value]) / (double)MarketData.MarketData[MarketDataField.Ask.Value]) * 100;
if (Math.Abs(diff) > percent)
{
errorText += "Limit Price deviates from the ask price by " + percent + "%\r\n";
}
}
}
}
}
}

Пришлось переделать так:

if (_limitPrice.Value.HasValue)
{
double limitPrice = _limitPrice.Value.Value;
double warningPercent;

string percentStr = AppSettingService.GetString(AppSettingsKeys.WarningPercent, null);
if (double.TryParse(percentStr, out warningPercent))
{
if (MarketData.MarketData[MarketDataField.Last.Value] != null)
{
errorText += CheckPriceDeviation(MarketData, MarketDataField.Last.Value, "last", limitPrice, warningPercent);
}
else
{
if (side.Equals(Side.Buy))
{
errorText += CheckPriceDeviation(MarketData, MarketDataField.Bid.Value, "bid", limitPrice, warningPercent);
}
else
{
errorText += CheckPriceDeviation(MarketData, MarketDataField.Ask.Value, "ask", limitPrice, warningPercent);
}
}
}
}

private static string CheckPriceDeviation(MarketDataProvider marketData, string marketDataField, string fieldName, double limitPrice,
double warningPercent)
{
string result = null;

object priceObj = marketData.MarketData[marketDataField];
if (priceObj != null && priceObj is double)
{
double price = (double)priceObj;
if (price != 0)
{
double diff = ((limitPrice - price) / price) * 100;
if (Math.Abs(diff) > warningPercent)
{
result = "Limit Price deviates from the " + fieldName + "price by " + warningPercent + "%." + Environment.NewLine;
}
}
}

return result;
}
///
/// Contains a list of keys which can be used to obtain settings from appSettings
///
public static class AppSettingsKeys
{
///
/// A key under which the maximal percent by that an entered limit price can deviate
/// from last/bid/ask price without displaying a warning is stored.
///
public static readonly string WarningPercent = "WarningPercent";
}

"Что же было не так?" - спросит меня неискушенный читатель?
  1. А БЛЯТЬ КОПИПАСТОМ ТРИ КУСКА НАПИСАТЬ - ЭТО КАК?
  2. А 3 раза строку в виде литерала, а не константы впихнуть?
  3. А по 5 раз писать
    (double)MarketData.MarketData[MarketDataField.Ask.Value] вместо того, чтоб скопировать в переменную и использовать потом? Это не только хуево читается, но и жутко неэффективно (куча вызовов методов и приведений).
  4. Ну и ясен хуй мы не проверяем число на ноль, прежде чем поделить на него, из-за чего я собственно и полез.
Так что если ты пишешь так же, дружок, Code Nazi уже идет к тебе!

занимательная хуйня, кодинг

Previous post Next post
Up