У мене було декілька, якими я пишаюся, і деякі з них написав сам кілька років тому. Це не обов'язково має бути баггі, просто поганий код.
У мене було декілька, якими я пишаюся, і деякі з них написав сам кілька років тому. Це не обов'язково має бути баггі, просто поганий код.
Відповіді:
Я не знаю, як пишатися виправленням, тому що це було так очевидно, але найжахливішим кодом, який я пам'ятаю, було виправлення.
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 в школі, я не мав досвіду, але я був низьким чоловіком на полюсі тотемів, і нам потрібно було надати компіляцію вихідного коду сторонній компанії для перевірки Y2K. У нас був один файл COBOL з декількома підпрограмами, які викликали один одного у файлі, схожі на спагетті, і він був занадто великий, щоб завантажити його в поточний IDE для компіляції. Її потрібно було розділити щонайменше на два фізичні файли, і ті файли, звичайно, потрібні, щоб мати все необхідне у власному файлі. (Або, можливо, був спосіб зв’язати їх разом, але я дійсно не знав COBOL.)
У будь-якому випадку я взяв цей файл близько 100 000 рядків і обережно розбив десятки і десятки процедур, щоб знайти два набори підпрограм, які не залежать одна від одної, і, отже, можуть існувати у двох окремих файлах, кожен з яких близько 50 000 рядків. (Я думаю, що максимум, з яким компілятор міг обробитись, становив близько 80 000 рядків, тому потрібно було рівномірно відповідати.)
Я читав давню мову, яку не знав, і все ще успішно вирішував завдання.
Я вийняв курсор з тригера і скоротив час, щоб вставити 40000 нових записів з години до менш ніж хвилини. Врешті-решт це призвело до того, що мені вдалося вставити 21 мільйон записів за щось менше, ніж льодовиковий час, але ми ніколи не намагалися імпортувати 20 мільйонів записів до виправлення, тому у мене немає статистики, скільки часу ми заощадили.
Існував базовий клас для створення діалогів підтвердження для різних операцій на деревних вузлах. Вам потрібно буде лише вказати повідомлення, яке відображатиметься у діалоговому вікні, та виконувати дію, якщо воно було підтверджене. Хороша система, але вона не допускала спеціальних операцій у випадку, якщо не було вибрано вузол дерева. У результаті текст в одному з діалогів сказав: "Будь ласка, виберіть ні". Якщо ви вибрали так, це викинуло виняток. Дуже приємний досвід користувача.
Я це виправив, відключивши недійсні операції.
Найгірше, що я бачив, - це якийсь код Java для вилучення ключових пропозицій з текстового корпусу.
Справедливо кажучи, це ніщо в порівнянні з деякими нашими речами, але до і після цього все ж є величезна різниця в якості. Розглянемо наступне дійсне перед і після коду однієї функції:
Перш ніж (спробуйте розібратися, що це робить, перш ніж подивитися на After!):
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 / тощо. і виявимо нового інсталятора за годину, а не за тиждень + це знадобилось попередньому хлопцеві. Я дуже пишався собою.
Я думаю, що нічого навіть не наближається до цього :
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
Виправлення? Е, це не повинно вимагати великих пояснень.