У меня было несколько вещей, которыми я горжусь, и некоторые из них были написаны мной несколько лет назад. Это не обязательно должно быть глючно, просто плохой код.
У меня было несколько вещей, которыми я горжусь, и некоторые из них были написаны мной несколько лет назад. Это не обязательно должно быть глючно, просто плохой код.
Ответы:
Я не знаю, горжусь ли исправлением, потому что оно было настолько очевидным, но самый ужасный код, который я помню, это исправление.
if (userName=="John O'Reily") { userName= "John O''Reily";}
if (userName=="Stacy O'Neil") { userName= "Stacy O''Neil";}
if (userName=="Finnegan O'Connor") { userName= "Finnegan O''Connor";}
...
someSQL = "SELECT * from Users where UserName='" + userName + "'";
Очевидно, предыдущий разработчик просто продолжал добавлять новые строки каждый раз, когда новый (обычно ирландский) пользователь начинал получать ошибки в приложении.
Я оставлю это в качестве упражнения для класса, как это было исправлено.
UserName='John O''Reily'
что станет UserName='John OReily'
(например, как C объединяет смежные строковые литералы), но не думал о пропавшем '
:(
Я не должен этим гордиться, но по какой-то причине это доставляло удовольствие.
Кроме того, что у меня был COBOL в школе, у меня не было опыта, но я был слабым человеком на тотемном столбе, и нам нужно было предоставить исходный код стороннему поставщику для проверки на 2000 год. У нас был один файл COBOL с несколькими подпрограммами, которые вызывали друг друга в файле, как спагетти, и он был слишком велик для загрузки в нашу текущую IDE для компиляции. Его нужно было разделить по крайней мере на два физических файла, и эти файлы, конечно, должны были иметь все необходимое в своем собственном файле. (Или, возможно, был способ связать их вместе, но я действительно не знал КОБОЛ.)
Во всяком случае, я взял этот файл из примерно 100 000 строк и аккуратно разобрал десятки и десятки подпрограмм, чтобы найти два набора подпрограмм, которые не зависят друг от друга и, следовательно, могут существовать в двух отдельных файлах, каждый из которых содержит около 50 000 строк. (Я думаю, что максимум, который мог обработать компилятор, составлял около 80 000 строк, поэтому он должен быть достаточно равномерно согласован.)
Я читал древний язык, которого я не знал, и все еще успешно справлялся с заданием.
Я вынул курсор из триггера и сократил время вставки 40000 новых записей с часа до менее минуты. В конечном итоге это привело к тому, что я смог вставить 21 миллион записей за меньшее, чем ледниковое время, но мы никогда не пробовали импортировать 20 миллионов записей до исправления, поэтому у меня нет статистики того, сколько времени мы сэкономили.
Существовал базовый класс для создания диалогов подтверждения для различных операций на узлах дерева. Вам потребуется только предоставить сообщение, которое будет отображаться в диалоговом окне, и действие, которое нужно выполнить, если оно было подтверждено. Хорошая система, но она не позволяла никакой специальной обработки в случае, если не был выбран ни один узел дерева. В результате текст в одном из диалогов сказал: «Пожалуйста, выберите нет». Если вы выбрали да, это бросило исключение. Очень хороший пользовательский опыт, действительно.
Я исправил это, отключив недопустимые операции.
Худшее, что я видел, это какой-то Java-код для извлечения ключевых предложений из текстового корпуса.
Честно говоря, это ничто по сравнению с некоторыми из наших вещей, но качество и до, и после остается огромным. Рассмотрим следующий фактический код до и после одной функции:
До (попробуйте выяснить, что он делает, прежде чем смотреть на После!):
public static void getCluster() {
count = new Vector();
for (int i = 0; i < begin.size(); i ++)
count.add("1");
if (begin.size() > 1) {
for (int i = 0; i < begin.size() - 1; i ++) {
for (int j = i + 1; j < begin.size(); j ++) {
int b1 = Integer.parseInt(begin.get(i).toString());
int e1 = Integer.parseInt(end.get(i).toString());
double w1 = Double.parseDouble(wght.get(i).toString());
int c1 = Integer.parseInt(count.get(i).toString());
int b2 = Integer.parseInt(begin.get(j).toString());
int e2 = Integer.parseInt(end.get(j).toString());
double w2 = Double.parseDouble(wght.get(j).toString());
int c2 = Integer.parseInt(count.get(j).toString());
int max = Math.max(e1, e2);
boolean toRemove = true;
if (b1 == b2) end.set(i, Integer.toString(max));
if (b1 < b2) {
if (b2 < e1) end.set(i, Integer.toString(max));
else {
if ((b2 - e1) <= 3) end.set(i, Integer.toString(e2));
else toRemove = false;
}
}
if (b1 > b2) {
if (e2 >= b1) {
begin.set(i, Integer.toString(b2));
end.set(i, Integer.toString(max));
} else {
if ((b1 - e2) <= 3) {
begin.set(i, Integer.toString(b2));
end.set(i, Integer.toString(e1));
} else toRemove = false;
}
}
//System.out.println(b1 + ", " + e1 + ", " + b2 + ", " + e2 + " ---> " + begin.get(i).toString() + ", " + end.get(i).toString());
if (toRemove) {
wght.set(i, Double.toString(w1 + w2));
count.set(i, Integer.toString(c1 + c2));
begin.removeElementAt(j);
end.removeElementAt(j);
wght.removeElementAt(j);
count.removeElementAt(j);
j --;
} //end of if
} //end of for j
} //end of for i
} //end of if
//System.out.println(begin);
//System.out.println(end);
//System.out.println(wght);
//System.out.println(count);
}
После:
/** Returns the result of merging all overlapping-with-leeway clusters into single combined clusters.
* @param leeway The minimum number of word-spaces which must separate two clusters in order for them to not be overlapping.
* @requires clusters != null
* @requires leeway >= 0
* @ensures result != null */
private static List<TermCluster> combineOverlappingClusters(Iterable<TermCluster> clusters, int leeway) {
if (clusters == null) throw new NullPointerException("clusters");
if (leeway < 0) throw new IllegalArgumentException("leeway < 0");
//Sort to allow linear folding
List<TermCluster> sortedClusters = Iter.sort(clusters, new Comparator<TermCluster>() {
@Override public int compare(TermCluster o1, TermCluster o2) {
return new Integer(o1.begin).compareTo(o2.begin);
}
});
if (sortedClusters.size() == 0)
return sortedClusters;
//Combine left-to-right
List<TermCluster> result = new ArrayList<TermCluster>();
TermCluster acc = sortedClusters.get(0);
for (TermCluster cluster : sortedClusters.subList(1, sortedClusters.size())) {
if (acc.isOverlappingWithLeeway(cluster, leeway)) {
//combine
acc = acc.combineWith(cluster);
} else {
//next
result.add(acc);
acc = cluster;
}
}
result.add(acc); //leftovers
return result;
}
Моей первой работой по программированию было написание инсталляторов в InstallShield. Я унаследовал сценарий, который был тысяч строк без функций , только gotos. Это было ошеломляюще. Я переписал его, сделал все это красивым, модульным и управляемым данными, чтобы мне можно было получить исполняемые файлы / art / etc. и вытащить новый установщик менее чем за час, а не за неделю + это занял предыдущий парень. Я был очень горд собой.
Я думаю, что ничто даже близко не подходит к этому :
function pmn_Sort(strBy)
local tblA = {};
local tblB = {};
local tblC = {};
local tblD = {};
local tblE = {};
local tblF = {};
local tblG = {};
local tblH = {};
local tblI = {};
local tblJ = {};
local tblK = {};
local tblL = {};
local tblM = {};
local tblN = {};
local tblO = {};
local tblP = {};
local tblQ = {};
local tblR = {};
local tblS = {};
local tblT = {};
local tblU = {};
local tblV = {};
local tblW = {};
local tblX = {};
local tblY = {};
local tblZ = {};
local tblOT = {};
local iA = 0;
local iB = 0;
local iC = 0;
local iD = 0;
local iE = 0;
local iF = 0;
local iG = 0;
local iH = 0;
local iI = 0;
local iJ = 0;
local iK = 0;
local iL = 0;
local iM = 0;
local iN = 0;
local iO = 0;
local iP = 0;
local iQ = 0;
local iR = 0;
local iS = 0;
local iT = 0;
local iU = 0;
local iV = 0;
local iW = 0;
local iX = 0;
local iY = 0;
local iZ = 0;
local iOT = 0;
if strBy == "Name" then
strSort = "Name";
numPlcount = ListBox.GetCount("Playlist");
numPLitem = 1;
numPLadd = 0;
while numPLitem <= numPlcount do
strPLtxt = ListBox.GetItemText("Playlist", numPLitem);
strPLdata = ListBox.GetItemData("Playlist", numPLitem);
strPLleft = String.Left(strPLtxt, 1);
if strPLleft == "a" or strPLleft == "A" then
iA = iA + 1;
tblA[iA] = strPLdata;
elseif strPLleft == "b" or strPLleft == "B" then
iB = iB + 1;
tblB[iB] = strPLdata;
elseif strPLleft == "c" or strPLleft == "C" then
iC = iC + 1;
tblC[iC] = strPLdata;
elseif strPLleft == "d" or strPLleft == "D" then
iD = iD + 1;
tblD[iD] = strPLdata;
elseif strPLleft == "e" or strPLleft == "E" then
iE = iE + 1;
tblE[iE] = strPLdata;
elseif strPLleft == "f" or strPLleft == "F" then
iF = iF + 1;
tblF[iF] = strPLdata;
elseif strPLleft == "g" or strPLleft == "G" then
iG = iG + 1;
tblG[iG] = strPLdata;
elseif strPLleft == "h" or strPLleft == "H" then
iH = iH + 1;
tblH[iH] = strPLdata;
elseif strPLleft == "i" or strPLleft == "I" then
iI = iI + 1;
tblI[iI] = strPLdata;
elseif strPLleft == "j" or strPLleft == "J" then
iJ = iJ + 1;
tblJ[iJ] = strPLdata;
elseif strPLleft == "k" or strPLleft == "K" then
iK = iK + 1;
tblK[iK] = strPLdata;
elseif strPLleft == "l" or strPLleft == "L" then
iL = iL + 1;
tblL[iL] = strPLdata;
elseif strPLleft == "m" or strPLleft == "M" then
iM = iM + 1;
tblM[iM] = strPLdata;
elseif strPLleft == "n" or strPLleft == "N" then
iN = iN + 1;
tblN[iN] = strPLdata;
elseif strPLleft == "o" or strPLleft == "O" then
iO = iO + 1;
tblO[iO] = strPLdata;
elseif strPLleft == "p" or strPLleft == "P" then
iP = iP + 1;
tblP[iP] = strPLdata;
elseif strPLleft == "q" or strPLleft == "Q" then
iQ = iQ + 1;
tblQ[iQ] = strPLdata;
elseif strPLleft == "r" or strPLleft == "R" then
iR = iR + 1;
tblR[iR] = strPLdata;
elseif strPLleft == "s" or strPLleft == "S" then
iS = iS + 1;
tblS[iS] = strPLdata;
elseif strPLleft == "t" or strPLleft == "T" then
iT = iT + 1;
tblT[iT] = strPLdata;
elseif strPLleft == "u" or strPLleft == "U" then
iU = iU + 1;
tblU[iU] = strPLdata;
elseif strPLleft == "v" or strPLleft == "V" then
iV = iV + 1;
tblV[iV] = strPLdata;
elseif strPLleft == "w" or strPLleft == "W" then
iW = iW + 1;
tblW[iW] = strPLdata;
elseif strPLleft == "x" or strPLleft == "X" then
iX = iX + 1;
tblX[iX] = strPLdata;
elseif strPLleft == "y" or strPLleft == "Y" then
iY = iY + 1;
tblY[iY] = strPLdata;
elseif strPLleft == "z" or strPLleft == "Z" then
iZ = iZ + 1;
tblZ[iZ] = strPLdata;
else
iOT = iOT + 1;
tblOT[iOT] = strPLdata;
end
numPLitem = numPLitem + 1;
end
ListBox.DeleteItem("Playlist", LB_ALLITEMS);
for ii, id in tblA do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblB do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblC do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblD do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblE do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblF do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblG do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblH do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblI do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblJ do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblK do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblL do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblM do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblN do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblO do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblP do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblQ do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblR do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblS do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblT do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblU do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblV do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblW do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblX do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblY do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblZ do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
for ii, id in tblOT do
if id ~= "" then
numPLadd = numPLadd + 1;
strPLtxt = String.SplitPath(id).Filename..String.SplitPath(id).Extension
ListBox.AddItem("Playlist", strPLtxt, id);
end
end
elseif strBy == "Type" then
strSort = "Type";
if File.DoesExist(_ProgramFilesFolder.."\\MediaX\\playlist.mx") == true then
play_file2 = TextFile.ReadToTable(_ProgramFilesFolder.."\\MediaX\\playlist.mx");
if play_file2 then
ListBox.DeleteItem("Playlist", -1);
for rl,rPath in play_file2 do
r2Path = String.TrimLeft(rPath, nil);
ListBox.AddItem("Playlist", String.SplitPath(r2Path).Filename..String.SplitPath(r2Path).Extension, r2Path);
end
end
end
end
end
Исправление? Эх, это не должно требовать особых объяснений.