Emocode detected!

Apr 09, 2008 15:18


Я не являюсь сторонником такого кода, в котором нарисован единственный регэксп в пару-тройку-другую сотен символов длиною, который не в подъём уму уразуметь... МЦ

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

Было (комменты мои):

MatchCollection parts = regex.Matches(Formula.FormulaBody);

// Гм...
if(sex.ToLower() == "male" && parts.Count!=0)
res = parts[0].Value;
else if( sex.ToLower() == "female" && parts.Count!=0 && parts.Count > 1)
res = parts[1].Value;

бла-бла-бла

// Этот код должен всего лишь заменить все вхождения типа [var_name] на значение переменной....

foreach (string str in calc.Variables.Keys)
{
Measurement mes = MeasurementByName(str);
if (mes == null || mes.ShortName == "") continue;
while (res.IndexOf(str)>-1)
{
int ind = res.IndexOf(str);
if (res[ind-1] == '[' && res[ind+(str).Length]==']')
{
res = res.Remove(ind,(str).Length);
res = res.Insert(ind,mes.ShortName);
}
}
}

бла-бла-бла

// А все что ниже должно разбавить указанные символы пробелами...
ArrayList places = new ArrayList();

ArrayList places = new ArrayList();

for (int i = 0;i    {
      /// ААААААААААААААААА!!!!!
      if (res[i]=='*'||res[i]=='/'||res[i]=='+'||res[i]=='-'||res[i]=='('||res[i]==')')
      {
        places.Add(i);
       }
    }
    for (int j = places.Count-1;j>=0;j--)
    {
      if ((int)places[j]+1      if ((int)places[j]>0)             res = res.Insert((int)places[j]," ");
    }

Я немного причесал код и получлось вот что:

int idx = (sex.ToLower() == "male") ? 0 : 1;
   if(idx<=parts.Count) res = parts[idx].Value;
   }

Calculator calc = new Calculator(res);
  foreach (string str in calc.Variables.Keys)
           {
                Measurement mes = MeasurementByName(str);
                if (mes == null || mes.ShortName == "") continue;
                res = res.Replace(string.Format("[{0}]", str), mes.ShortName);
            }

string symbols = "*/+-()";

System.Text.StringBuilder sb = new System.Text.StringBuilder("");

for (int i = 0;i            {
                string cur = ((symbols.IndexOf(res[i]) >= 0) ? string.Format("[{0}]", res[i]) : new string(res[i]));
                sb.Append(cur);
            }

res = sb.ToString().Trim();

Хотя последнее можно было бы и регекспом сделать, но лень..

программизм

Previous post Next post
Up