Какой самый лучший комментарий в исходном коде вы когда-либо встречали?
Какой самый лучший комментарий в исходном коде вы когда-либо встречали?
Ответы (395)
Я особенно виноват в этом, встраивая неконструктивные комментарии, поэзию кода и небольшие шутки в большинство своих проектов (хотя обычно у меня достаточно здравого смысла, чтобы удалить что-либо прямо оскорбительное перед выпуском кода). Вот один, который мне особенно нравится, расположенный далеко-далеко от плохо спроектированного «Божественного объекта»:
/**
* For the brave souls who get this far: You are the chosen ones,
* the valiant knights of programming who toil away, without rest,
* fixing our most awful code. To you, true saviors, kings of men,
* I say this: never gonna give you up, never gonna let you down,
* never gonna run around and desert you. Never gonna make you cry,
* never gonna say goodbye. Never gonna tell a lie and hurt you.
*/
ИЗВИНИТЕ !!!! Я просто не мог с собой поделать .....!
И еще один, который, я признаю, я на самом деле не выпустил в дикую природу, хотя я очень склонен сделать это в одном из моих менее интуитивных классов:
//
// Dear maintainer:
//
// Once you are done trying to 'optimize' this routine,
// and have realized what a terrible mistake that was,
// please increment the following counter as a warning
// to the next guy:
//
// total_hours_wasted_here = 42
//
Кажется, это мешает идиотам испортить мой код ...
// Autogenerated, do not edit. All changes will be undone.
//Code sanitized to protect the foolish. using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Web.UI; namespace Mobile.Web.Control { /// <summary> /// Class used to work around Richard being a fucking idiot /// </summary> /// <remarks> /// The point of this is to work around his poor design so that paging will /// work on a mobile control. The main problem is the BindCompany() method, /// which he hoped would be able to do everything. I hope he dies. /// </remarks> public abstract class RichardIsAFuckingIdiotControl : MobileBaseControl, ICompanyProfileControl { protected abstract Pager Pager { get; } public void BindCompany(int companyId) { } public RichardIsAFuckingIdiotControl() { MakeSureNobodyAccidentallyGetsBittenByRichardsStupidity(); } private void MakeSureNobodyAccidentallyGetsBittenByRichardsStupidity() { // Make sure nobody is actually using that fucking bindcompany method MethodInfo m = this.GetType().GetMethod("BindCompany", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (m != null) { throw new RichardIsAFuckingIdiotException("No!! Don't use the fucking BindCompany method!!!"); } // P.S. this method is a joke ... the rest of the class is fucking serious } /// <summary> /// This returns true if this control is supposed to be doing anything /// at all for this request. Richard thought it was a good idea to load /// the entire website during every request and have things turn themselves /// off. He also thought bandanas and aviator sunglasses were "fuckin' /// gnarly, dude." /// </summary> protected bool IsThisTheRightPageImNotSureBecauseRichardIsDumb() { return Request.QueryString["Section"] == this.MenuItemKey; } protected override void OnLoad(EventArgs e) { if (IsThisTheRightPageImNotSureBecauseRichardIsDumb()) { Page.LoadComplete += new EventHandler(Page_LoadComplete); Pager.RowCount = GetRowCountBecauseRichardIsDumb(); } base.OnLoad(e); } protected abstract int GetRowCountBecauseRichardIsDumb(); protected abstract void BindDataBecauseRichardIsDumb(); void Page_LoadComplete(object sender, EventArgs e) { BindDataBecauseRichardIsDumb(); } // the rest of his reduh-ndant interface members public abstract string MenuItemName { get; set; } public abstract string MenuItemKey { get; set; } public abstract bool IsCapable(CapabilityCheck checker, int companyId); public abstract bool ShowInMenu { get; } public virtual Control CreateHeaderControl() { return null; } } }
Обновление: исходный автор кода имеет выдал себя, так что я должен отдать должное. Дэн МакКинли покинул компанию, в которой я работал, вскоре после того, как я начал, и он больше рассказывает о коде, объясняя некоторые предыстории и еще несколько «WTF», которые написал «Ричард».
// drunk, fix later
Жаль, что я шутил. И зная разработчика, написавшего код, я думаю, он имел в виду буквально.
/* This is O(scary), but seems quick enough in practice. */
за которыми следуют четыре вложенных цикла for
Это красноречиво говорит о нашей профессии: когда мы спрашиваем о «лучшем комментарии», мы все отвечаем худшими комментариями, которые только можем найти ...
/**
* Always returns true.
*/
public boolean isAvailable() {
return false;
}
Никогда не полагайтесь на комментарий ...
От: https://github.com/zepouet/Xee-xCode-4.5/blob/master/XeePhotoshopLoader.m#L108
// At this point, I'd like to take a moment to speak to you about the Adobe PSD
// format. PSD is not a good format. PSD is not even a bad format. Calling it
// such would be an insult to other bad formats, such as PCX or JPEG. No, PSD
// is an abysmal format. Having worked on this code for several weeks now, my
// hate for PSD has grown to a raging fire that burns with the fierce passion
// of a million suns.
//
// If there are two different ways of doing something, PSD will do both, in
// different places. It will then make up three more ways no sane human would
// think of, and do those too. PSD makes inconsistency an art form. Why, for
// instance, did it suddenly decide that *these* particular chunks should be
// aligned to four bytes, and that this alignement should *not* be included in
// the size? Other chunks in other places are either unaligned, or aligned with
// the alignment included in the size. Here, though, it is not included. Either
// one of these three behaviours would be fine. A sane format would pick one.
// PSD, of course, uses all three, and more.
//
// Trying to get data out of a PSD file is like trying to find something in the
// attic of your eccentric old uncle who died in a freak freshwater shark
// attack on his 58th birthday. That last detail may not be important for the
// purposes of the simile, but at this point I am spending a lot of time
// imagining amusing fates for the people responsible for this Rube Goldberg of
// a file format.
//
// Earlier, I tried to get a hold of the latest specs for the PSD file format.
// To do this, I had to apply to them for permission to apply to them to have
// them consider sending me this sacred tome. This would have involved faxing
// them a copy of some document or other, probably signed in blood. I can only
// imagine that they make this process so difficult because they are intensely
// ashamed of having created this abomination. I was naturally not gullible
// enough to go through with this procedure, but if I had done so, I would have
// printed out every single page of the spec, and set them all on fire. Were it
// within my power, I would gather every single copy of those specs, and launch
// them on a spaceship directly into the sun.
//
// PSD is not my favourite file format.
Примерно в середине 30-страничного xslt
<!-- Here be dragons -->
в полностью раскомментированном методе строк 2000
{
{
while (.. ){
if (..){
}
for (.. ){
}
.... (just putting in the control flow here, imagine another few hundred ifs)
if(..) {
if(..) {
if(..) {
...
(another few hundred brackets)
}
}
} //endif
(Однажды я вычеркнул все скобки, просто чтобы посмотреть, насколько это плохо, и, без форматирования, получил следующее:
{{{{}}{}{}{}{}}{{}{{}{}{}{}{}{}{{}{}}{}{}{{}{}{}{}{}{}{}{}{}{}{}{{}}}{{}{{}}{{{}}}{{}{}{}{}{}{}{}{{}}{}{{{}}{}{{}{}}{{{}}{}{}{}{}}{{}}}{}{{}{}{}{{}{{}}{}}{{}}}{{}}{{}}{{}}{}{{}}{{}}{{}}{{}{}{}}{}{}{{{}}{{}}}{}{}{}{}}{{{}{{}{}{}{{}{}{}{}{}{}}{}}{{}}{{}{}}}{{}}{{}}}{{}}{{}}{}{}{}{}{{}}{{}{}{}{}}}}{}{}}{{}{{{}{}{}{}}}}{{}{{{}}}}{{}{{{}{{}}{}{{}}{}{{}{}}{{}}{}{{}}}{{}}}}{{}{}{}{}{}{{{} {{{{}}{}{}{}{}}{{}{{}{}{}{}{}{}{{}{}}{}{}{{}{}{}{}{}{}{}{}{}{}{}{{}}}{{}{{}}{{{}}}{{}{}{}{}{}{}{}{{}}{}{{{}}{}{{}{}}{{{}}{}{}{}{}}{{}}}{}{{}{}{}{{}{{}}{}}{{}}}{{}}{{}}{{}}{}{{}}{{}}{{}}{{}{}{}}{}{}{{{}}{{}}}{}{}{}{}}{{{}{{}{}{}{{}{}{}{}{}{}}{}}{{}}{{}{}}}{{}}{{}}}{{}}{{}}{}{}{}{}{{}}{{}{}{}{}}}}{}{}}{{}{{{}{}{}{}}}}{{}{{{}}}}{{}{{{}{{}}{}{{}}{}{{}{}}{{}}{}{{}}}{{}}}}{{}{}{}{}{}{{{}{}{{}}{}}}{}}{{}}{{}{}}{{}{{}{{}}}}{{{}{{{}}}}}{{{{{}}}}}{}{}{}{{{{}}}{}{}}{{}{{}}}}{}{{}}{}}}{}}{{}}{{}{}}{{}{{}{{}}}}{{{}{{{}}}}}{{{{{}}}}}{}{}{}{{{{}}}{}{}}{{}{{}}}}
Endif появился около строки 800)
Одним из самых классических является замечание Пьера де Ферма по поводу его известной «Последней теоремы»: «Поле этой страницы слишком мало, чтобы записать доказательство».
Доказательство было найдено более 350 лет назад ...
(Согласно wikipedia, это исходный текст :)
Cubum autem в duos cubos, aut quadratoquadratum in duos quadratoquadratos, et generaliter nullam in infinitum ultra quadratum potestatem в duos eiusdem nominis fas est Dividere cuius rei демонстрацияем мирабилем разумных детей. Hanc marginis exiguitas non caperet.
... и переведены на английский язык:
(Невозможно разделить куб на два куба, или четвертую степень на две четвертых, или вообще любую степень выше второй, на две одинаковые степени. Я обнаружил поистине чудесное доказательство этого, которое слишком узкий, чтобы вместить.)
Из Java 1.2 SwingUtilities:
doRun.run(); // ... "a doo run run".
# To understand recursion, see the bottom of this file
Внизу файла:
# To understand recursion, see the top of this file
Это было живым доказательством в производственном коде эффектов микроуправления в нашей команде:
// I am not responsible of this code.
// They made me write it, against my will.
... за которым следует менее чем оптимальный код, задуманный нашим любимым техническим директором, который очень любил навязывать разработчикам как код, так и рекомендации по написанию кода (*).
Конечно, когда руководитель проекта искал причину ошибки и обнаружил, что она находится внутри «неоптимального кода», он был менее чем удивлен ...
(*) Я, конечно, упоминаю Могущественного Короля В.Б. ... Если вы хотите оценить всю мощь Могущественного Короля В.Б. , вы можете прочитать следующее сообщение SO: Какое самое странное стандартное правило кодирования, которому вы были вынуждены следовать? ...
Я прошел через цикл программирования, лишенный сна, и начал писать только комментарии, которые были цитатами из Бойцовского клуба.
Спустя годы, продолжая рыться в коде, я нахожу комментарий, который заставляет меня смеяться. Большинство из них - просто случайные мысли. Тем не менее, я сохранил довольно хорошее соотношение комментариев к строкам!
// This shouldn't happen. The only way this can happen is if the
// <code>JFileChooser</code> has returned a <code>File</code> that doesn't exist
// on the system. If this happens we can't recover, and there is more than likely
// a rip in the space time continuum that the user is too distracted by to notice
// anything else.
/**
* This method leverages collective synergy to drive "outside of the box"
* thinking and formulate key objectives into a win-win game plan with a
* quality-driven approach that focuses on empowering key players to drive-up
* their core competencies and increase expectations with an all-around
* initiative to drive down the bottom-line. I really wanted to work the word
* "mandrolic" in there, but that word always makes me want to punch myself in
* the face.
*/
private void updateFileCountLabel() {
FileNotFound
(или любое другое исключение) можно обрабатывать в одном месте, независимо от того, какой шаг вызвал его.
- person Mike DeSimone; 17.09.2010
Много лет назад (около 1994 г.) я работал над приложением Oracle PRO * C для крупной международной компании-разработчика программного обеспечения, о которой вы, наверное, слышали. Приложение, над которым я работал, было огромным приложением Oracle, и у них была утилита, которая в течение ночи приводила в порядок данные и выполняла всевозможные агрегированные вычисления. Каждый раз, когда что-то требовалось выполнить в виде пакетной работы, это вставлялось в эту утилиту, и, как вы понимаете, это становилось абсолютным чудовищем. Он также отличался крошечным количеством комментариев, которые он имел по поводу такой масштабной программы.
Один из немногих комментариев, которые он имел, остается лучшим комментарием, который я когда-либо видел в отношении чистой WTF'ности ... Я пытался найти ошибку в функции, которая состояла из сотен строк, и прямо посередине был < strong> only комментарий в функции:
/* I did this the other way */
По сей день это лучший комментарий, который я когда-либо видел.
//Dear future me. Please forgive me.
//I can't even begin to express how sorry I am.
И я только что нашел вот это сегодня:
//private instance variable for storing age
public static int age;
//I am not sure why this works but it fixes the problem.
Это было до того, как набор кода технически исправил проблему, для которой он был предназначен, но сломал еще 3 вещи ...
Наш администратор базы данных обнаружил это в середине хранимой процедуры из 3000 строк, написанной третьей стороной.
/* IF DOLPHINS ARE SO SMART, HOW COME THEY LIVE IN IGLOOS? */
по js-коду:
// hack for ie browser (assuming that ie is a browser)
/* Emits a 7-Hz tone for 10 seconds.
True story: 7 Hz is the resonant frequency of a
chicken's skull cavity. This was determined
empirically in Australia, where a new factory
generating 7-Hz tones was located too close to a
chicken ranch: When the factory started up, all the
chickens died.
Your PC may not be able to emit a 7-Hz tone. */
main()
{
sound(7);
delay(10000);
nosound();
}
(функция звука в Справочном руководстве Turbo C версии 2.0)
... или умри // сука
Попробуйте ввести свою любимую ненормативную лексику в поиск по коду Google, это быстро проведет унылый час. Некоторые из моих любимых примеров:
/* These magic numbers are fucking stupid. */
/* Dear free software world, do you NOW see we are fucking
things up?! This is insane! */
/* We will NOT put a fucking timestamp in the header here. Every
time you put it back, I will come in and take it out again. */
# However, this only works if there are MULTIPLE checkboxes!
# The fucking JS DOM *changes* based on one or multiple boxes!?!?!
# Damn damn damn I hate the JavaScript DOM so damn much!!!!!!
/* TODO: this is obviously not right ... this whole fucking module
sucks anyway */
/* FIXME: please god, when will the hurting stop? Thus function is so
fucking broken it's not even funny. */
и мой личный фаворит
# code below replaces code above - any problems?
# yeah, it doesn't fucking work.
При инициализации связанного списка:
last = first; /* Biblical reference */
Лаконично и весело.
last, first = first, last
- person Tim Pietzcker; 09.10.2010
Кто-то жаловался, что «лучший» комментарий содержит худшие комментарии. ИМХО, они смешнее и так «лучше», но вот честный лучший комментарий, который я когда-либо делал читать:
/*
Major subtleties ahead: Most hash schemes depend on having a "good" hash
function, in the sense of simulating randomness. Python doesn't: its most
important hash functions (for strings and ints) are very regular in common
cases:
>>> map(hash, (0, 1, 2, 3))
[0, 1, 2, 3]
>>> map(hash, ("namea", "nameb", "namec", "named"))
[-1658398457, -1658398460, -1658398459, -1658398462]
>>>
This isn't necessarily bad! To the contrary, in a table of size 2**i, taking
the low-order i bits as the initial table index is extremely fast, and there
are no collisions at all for dicts indexed by a contiguous range of ints.
The same is approximately true when keys are "consecutive" strings. So this
gives better-than-random behavior in common cases, and that's very desirable.
OTOH, when collisions occur, the tendency to fill contiguous slices of the
hash table makes a good collision resolution strategy crucial. Taking only
the last i bits of the hash code is also vulnerable: for example, consider
[i << 16 for i in range(20000)] as a set of keys. Since ints are their own
hash codes, and this fits in a dict of size 2**15, the last 15 bits of every
hash code are all 0: they *all* map to the same table index.
But catering to unusual cases should not slow the usual ones, so we just take
the last i bits anyway. It's up to collision resolution to do the rest. If
we *usually* find the key we're looking for on the first try (and, it turns
out, we usually do -- the table load factor is kept under 2/3, so the odds
are solidly in our favor), then it makes best sense to keep the initial index
computation dirt cheap.
The first half of collision resolution is to visit table indices via this
recurrence:
j = ((5*j) + 1) mod 2**i
For any initial j in range(2**i), repeating that 2**i times generates each
int in range(2**i) exactly once (see any text on random-number generation for
proof). By itself, this doesn't help much: like linear probing (setting
j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed
order. This would be bad, except that's not the only thing we do, and it's
actually *good* in the common cases where hash keys are consecutive. In an
example that's really too small to make this entirely clear, for a table of
size 2**3 the order of indices is:
0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating]
If two things come in at index 5, the first place we look after is index 2,
not 6, so if another comes in at index 6 the collision at 5 didn't hurt it.
Linear probing is deadly in this case because there the fixed probe order
is the *same* as the order consecutive keys are likely to arrive. But it's
extremely unlikely hash codes will follow a 5*j+1 recurrence by accident,
and certain that consecutive hash codes do not.
The other half of the strategy is to get the other bits of the hash code
into play. This is done by initializing a (unsigned) vrbl "perturb" to the
full hash code, and changing the recurrence to:
j = (5*j) + 1 + perturb;
perturb >>= PERTURB_SHIFT;
use j % 2**i as the next table index;
Now the probe sequence depends (eventually) on every bit in the hash code,
and the pseudo-scrambling property of recurring on 5*j+1 is more valuable,
because it quickly magnifies small differences in the bits that didn't affect
the initial index. Note that because perturb is unsigned, if the recurrence
is executed often enough perturb eventually becomes and remains 0. At that
point (very rarely reached) the recurrence is on (just) 5*j+1 again, and
that's certain to find an empty slot eventually (since it generates every int
in range(2**i), and we make sure there's always at least one empty slot).
Selecting a good value for PERTURB_SHIFT is a balancing act. You want it
small so that the high bits of the hash code continue to affect the probe
sequence across iterations; but you want it large so that in really bad cases
the high-order hash bits have an effect on early iterations. 5 was "the
best" in minimizing total collisions across experiments Tim Peters ran (on
both normal and pathological cases), but 4 and 6 weren't significantly worse.
Historical: Reimer Behrends contributed the idea of using a polynomial-based
approach, using repeated multiplication by x in GF(2**n) where an irreducible
polynomial for each table size was chosen such that x was a primitive root.
Christian Tismer later extended that to use division by x instead, as an
efficient way to get the high bits of the hash code into play. This scheme
also gave excellent collision statistics, but was more expensive: two
if-tests were required inside the loop; computing "the next" index took about
the same number of operations but without as much potential parallelism
(e.g., computing 5*j can go on at the same time as computing 1+perturb in the
above, and then shifting perturb can be done while the table index is being
masked); and the dictobject struct required a member to hold the table's
polynomial. In Tim's experiments the current scheme ran faster, produced
equally good collision statistics, needed less code & used less memory.
Theoretical Python 2.5 headache: hash codes are only C "long", but
sizeof(Py_ssize_t) > sizeof(long) may be possible. In that case, and if a
dict is genuinely huge, then only the slots directly reachable via indexing
by a C long can be the first slot in a probe sequence. The probe sequence
will still eventually reach every slot in the table, but the collision rate
on initial probes may be much higher than this scheme was designed for.
Getting a hash code as fat as Py_ssize_t is the only real cure. But in
practice, this probably won't make a lick of difference for many years (at
which point everyone will have terabytes of RAM on 64-bit boxes).
*/
int MyFunction()
{
// There once was a man named Dave
int Result = 0;
// Whose code just wouldn't behave
MyObject *Ptr = new MyObject();
// He left to go to a meetin'
Result = Ptr->DoSomething();
// And left his memory a leakin'
return Result;
}
Комментарий C ++
Из утечки Windows 2004 г.
__inline BOOL
SearchOneDirectory(
IN LPSTR Directory,
IN LPSTR FileToFind,
IN LPSTR SourceFullName,
IN LPSTR SourceFilePart,
OUT PBOOL FoundInTree
)
{
//
// This was way too slow. Just say we didn't find the file.
//
*FoundInTree = FALSE;
return(TRUE);
}
Я видел этот комментарий к чьему-то коду:
// This comment is self explanatory.
Я предполагаю, что он хотел сказать «переменная», но из-за ошибки был сделан один забавный комментарий ... Подумайте о круговой логике здесь и о бесполезности ее написания.
Не совсем комментарий, а ярлык goto
ICantBelieveImUsingAGoto:
Рядом с локальной переменной, которую нужно было объявить только для передачи константы библиотечной функции:
// This only exists because Scott doesn't know how to use const correctly
В оригинальном Doom был двигатель со статичными стенками, которые не могли двигаться; в результате все двери открывались вертикально; ничто не могло двигаться по горизонтали. Я рассмеялся, когда после того, как исходный код был выпущен, я просматривал код и увидел это в исходном файле для обработки дверей, в начале большого блока закомментированного кода:
// UNUSED
// Separate into p_slidoor.c?
#if 0 // ABANDONED TO THE MISTS OF TIME!!!
//
// EV_SlidingDoor : slide a door horizontally
// (animate midtexture, then set noblocking line)
//
Взято из источника Quake III, я наткнулся на это в какой-то случайной публикации на слэшдоте. Полный источник файла можно найти на здесь. Это особенно быстрый метод вычисления обратного квадратного корня. Что насчет лучшего комментария? Конечно, это обычное дело, но, учитывая то, что он прикреплен к линии, которая творит чудеса, именно то, что делает его отличным.
float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;
x2 = number * 0.5F;
y = number;
i = * ( long * ) &y; // evil floating point bit level hacking
i = 0x5f3759df - ( i >> 1 ); // what the fuck?
y = * ( float * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
// y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
#ifndef Q3_VM
#ifdef __linux__
assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
return y;
}
// John! If you'll svn remove this once more,
// I'll shut you, for God's sake!
// That piece of code is not “something strange”!
// That is THE AUTH VALIDATION.
И что ты думаешь? Приведенный ниже код был благополучно удален с помощью svn.
это несколько раз появлялось в моем собственном коде. очевидно, не раз трогал:
// TODO: Fix this. Fix what?
//MailBody builders for two outgoing messages
StringBuilder hanz = new StringBuilder();
StringBuilder franz = new StringBuilder();
Я все еще немного хихикаю, когда читаю это ...
уйдя с последней работы, я встроил в исходник немного ascii-арта ...
,_-=(!7(7/zs_. .=' ' .`/,/!(=)Zm. .._,,._.. ,-`- `,\ ` -` -`\\7//WW. ,v=~/.-,-\- -!|V-s.)iT-|s|\-.' `///mK%. v!`i!-.e]-g`bT/i(/[=.Z/m)K(YNYi.. /-]i44M. v`/,`|v]-DvLcfZ/eV/iDLN\D/ZK@%8W[Z.. `/d!Z8m //,c\(2(X/NYNY8]ZZ/bZd\()/\7WY%WKKW) -'|(][%4. ,\\i\c(e)WX@WKKZKDKWMZ8(b5/ZK8]Z7%ffVM, -.Y!bNMi /-iit5N)KWG%%8%%%%W8%ZWM(8YZvD)XN(@. [ \]!/GXW[ / ))G8\NMN%W%%%%%%%%%%8KK@WZKYK*ZG5KMi,- vi[NZGM[ i\!(44Y8K%8%%%**~YZYZ@%%%%%4KWZ/PKN)ZDZ7 c=//WZK%! ,\v\YtMZW8W%%f`,`.t/bNZZK%%W%%ZXb*K(K5DZ -c\\/KM48 -|c5PbM4DDW%f v./c\[tMY8W%PMW%D@KW)Gbf -/(=ZZKM8[ 2(N8YXWK85@K -'c|K4/KKK%@ V%@@WD8e~ .//ct)8ZK%8` =)b%]Nd)@KM[ !'\cG!iWYK%%| !M@KZf -c\))ZDKW%` YYKWZGNM4/Pb '-VscP4]b@W% 'Mf` -L\///KM(%W! !KKW4ZK/W7)Z. '/cttbY)DKW% -` .',\v)K(5KW%%f 'W)KWKZZg)Z2/,!/L(-DYYb54% ,,`, -\-/v(((KK5WW%f \M4NDDKZZ(e!/\7vNTtZd)8\Mi!\-,-/i-v((tKNGN%W%% 'M8M88(Zd))///((|D\tDY\\KK-`/-i(=)KtNNN@W%%%@%[ !8%@KW5KKN4///s(\Pd!ROBY8/=2(/4ZdzKD%K%%%M8@%% '%%%W%dGNtPK(c\/2\[Z(ttNYZ2NZW8W8K%%%%YKM%M%%. *%%W%GW5@/%!e]_tZdY()v)ZXMZW%W%%%*5Y]K%ZK%8[ '*%%%%8%8WK\)[/ZmZ/Zi]!/M%%%%@f\ \Y/NNMK%%! 'VM%%%%W%WN5Z/Gt5/b)((cV@f` - |cZbMKW%%| 'V*M%%%WZ/ZG\t5((+)L\'-,,/ -)X(NWW%% `~`MZ/DZGNZG5(((\, ,t\\Z)KW%@ 'M8K%8GN8\5(5///]i!v\K)85W%%f YWWKKKKWZ8G54X/GGMeK@WM8%@ !M8%8%48WG@KWYbW%WWW%%%@ VM%WKWK%8K%%8WWWW%%%@` ~*%%%%%%W%%%%%%%@~ ~*MM%%%%%%@f` '''''
Не помню, где я это видел:
long time; /* know C */
и (в коде для создания своего рода демона UNIX):
/* Be a real daemon: fork myself and kill my parent */
Вверху файла заголовка:
/* Project : XYZ (Please somebody shoot me!)
*
* File : $Id: defs.h,v 1.1 $
*
* Purpose : Create havoc rather than peace among many nations
*
* History : Back-ported changes that were not in CVS. Please somebody,
* shoot us and put us all out of our misery.
*/
«Проект XYZ» (название изменено) был семилетним испытанием. Этот последний комментарий был написан одной стойкой душой, которая участвовала с самого начала до конца.
В драйверах / net / sunhme.c (ядро Linux):
/* Welcome to Sun Microsystems, can I take your order please? */
if(!hp->happy_flags & HFLAG_FENABLE)
return happy_meal_bb_write(hp, tregs, reg, value);
/* Would you like fries with that? */
hme_write32(hp, &tregs->frame,
(FRAME_WRITE | (hp->paddr << 23) |
((reg & 0xff) << 18) | (value & 0xffff)));
while(!(hme_read32(hp, &tregs->frame) & 0x10000) && --tries)
udelay(20);
/* Anything else? */
if(!tries)
printk(KERN_ERR "happy meal: Aieee, transceiver MIF write bolixed\n");
/* Fifty-two cents is your change, have a nice day. */
// Catching exceptions is for communists
Со страницы Майка Дункана на SQLite.
Комментарий, который я добавил к PHP CMS, над которым я работал некоторое время назад.
if (/*you*/ $_GET['action']) { //celebrate
Однажды я увидел в другом обсуждении что-то вроде этого:
// I can't divide with zero, so I have to divide with something very similar
result = number / 0.00000000000001;
Умное решение, не правда ли :)? (Это шутка, если кто-то не уверен)
Классический пример того, почему вы не должны оффшорить разработку программного обеспечения:
public class Contact
{
//...
/// <summary>
/// Gets or sets the name of the first.
/// </summary>
/// <value>The name of the first.</value>
public string FirstName
{
get { return _firstName; }
set { _firstName = value; }
}
}
в домашнем задании в колледже для учителя, который был особенно непреклонен, чтобы мы прокомментировали наш код:
//I wonder if she actually reads these.
Когда задание было возвращено, красным карандашом рядом с этим комментарием "Да, я верю"
Отличный вариант из утекшего исходного кода Windows 2000:
!!!!!!! ЕСЛИ ВЫ МЕНЯЕТЕ ТАБЛИЦЫ НА ПРОБЕЛЫ, ВАС УБИВАЕТСЯ !!!!!!! *
!!!!!!!!!!!!!! ДЕЙСТВИЕ ТАКОЕ НАБИРАЕТ ПРОЦЕСС СТРОИТЕЛЬСТВА !!!!!!!!!!!!!!!! *
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!
http://www.kuro5hin.org/story/2004/2/15/71552/7795
Мне всегда нравилось то, что Пол Дилашиа писал в своих заголовках файлов:
// If this code works, it was written by Paul DiLascia. If not, I don't know
// who wrote it
// human madable inconvenient. Way too sucks.
Я до сих пор не совсем понимаю, что это означает, но я обнаружил, что это очень верно в отношении большого количества кода.
// error codes
#define ERROR_SUCESS 0
#define ERROR_SUCCESS_IS_MISSPELLED 1
Другие коды ошибок не определены.
Из модуля монитора батареи во встроенной системе:
// batmon.c drives the rastamobile
Из утекшего исходного кода Windows 2000:
// The magnitude of this hack compares favorably with that of the national debt.
Еще одна классика Дональда Кнута, не менее:
Остерегайтесь ошибок в приведенном выше коде; Я только доказал, что это правильно, а не пробовал.
В планировщике ядра linux 1.0 (sched.c):
Дейкстра, наверное, меня ненавидит.
/*
* 'schedule()' is the scheduler function. It's a very simple and nice
* scheduler: it's not perfect, but certainly works for most things.
* The one thing you might take a look at is the signal-handler code here.
*
* NOTE!! Task 0 is the 'idle' task, which gets called when no other
* tasks can run. It can not be killed, and it cannot sleep. The 'state'
* information in task[0] is never used.
*
* The "confuse_gcc" goto is used only to get better assembly code..
* Dijkstra probably hates me.
*/
asmlinkage void schedule(void)
(...)
// This procedure is really good for your dorsolateral prefrontal cortex.
Для тех из вас, кто по какой-то особой причине не знает о DPC, это часть вашего мозга, которая загорается, когда вы глубоко заняты изучением чего-то нового.
//ALL YOUR BASE ARE BELONG TO US
... это заставило моего босса подумать, что кто-то взломал его. Он не знал шутки.
Верх исходных файлов sqlite:
/*
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
**
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
Я разместил это «лицензионное заявление» в выпущенном мной шаблоне WordPress. Во всяком случае, я думал, что это было забавно.
/* The License:
You (from this point on referred to as The You) are hereby
granted by me (from this point on referred to as The Me)
license to knock yourself silly with this template.
By using this template The You implicitly accepts this
license and pledges solemnly to never claim creative
ownership of any graphics, code, concepts, eggs, bacon, ideas,
colors, shapes, hypertext-transfer protocols or other conduits
of the visual splendor thatis this template.
The Me, in turn, pledges equally solemnly to be far too
lazy to ever check up on you, so if you do manage to pull
some chicks The Me won't have a cow.
However The Me would be sorely disappointed if The You
were to try and sell or distribute this work without
acknowledging The Me. Seriously. The Me will come down on
The You like a large quantitiy of hard and heavy objects
that in large quantities may be harmful and possibly even
lethal to The You; So don't even think about it, The Buster.
*/
Простой, но эффективный комментарий перед небезопасным взломом некоторого кода C ++
// yikes
Около 10 лет назад я работал над обработкой изображений, кадрами сканирующего микроскопа для обнаружения движения клеток. Я работал над очень сложным мероприятием и решил пойти выпить с друзьями. Вернувшись домой, я немного поработал, но не слишком много, потому что был пьян. На следующее утро после того, как я обнаружил 10-строчную полностью испорченную функцию со следующим комментарием (очевидно, написанным другим мной):
/* Ah ah ah! You'll never understand why this one works. */
Самым странным было то, что он даже работал.
Я использовал это несколько раз, когда делал какое-то неочевидное упрощение математической формулы, которое мне не хотелось документировать:
//this formula is right, work out the math yourself if you don't believe me
Из одного из наших проектов.
Где-то в конце одного исходного файла.
/*@ /\ /\ * @ / \/ \ ----- | | ---- |---\ | | /--\ --- | | ---- /--\ /--\ * @ / -- | | | | | / | | | | |\ | | | | * \---\ / \ | |---| ---- |--/ | | \ | | \ | ---- \ \ * | \------------------------/ /-\ \ | | | | | \ | | -\ | | \| | -\ -\ * | \-/ \ | | | ---- |---/ \--/ \--/ --- | \ ---- \--/ \--/ * \ ------O * \ / --- | | ---- /--\ |--\ /--\ /--\ * | | | | / | |\ | | | | | | | | | * | | | |----- ------- | | \ | ---- | | | | | | | /-\ * | |\ /| | \ WWWWWW/ | | \| | | | | | | | | | * | | \ / | | \------- --- | \ | \--/ |--/ \--/ \--/ * | | \--------------/ | | * / | / | * \ \ \ \ * \-----/ \-----/ */
//You are not expected to understand this
классический.
В инструкции GIGANTIC 800 line 'switch' где-то посередине:
// Joe is sorry
Через несколько сотен строк ...
// Harry is sorry too
Это настоящий код, который мне когда-то приходилось поддерживать. После попыток понять логику AstaSaysGooGoo и AstaSaysGaaGaa (где было объявлено и использовано гораздо больше astaTempVars) я был готов сдаться. Я наконец поднял глаза и увидел комментарий «@author», и все это начало обретать смысл.
/*
* @author Andrew Asta
*/
public class AstaClass{
private String astaVar1;
private String astaVar2;
private String astaVar3;
private String astaVar4;
private String astaVar5;
private String astaVar6;
private String astaVar7;
private String astaVar8;
private String astaVar9;
private String astaVar10;
public void AstaSaysGetData(){
//JDBC statement to populate astavars 1 through 10
//...
String astaSqlStatment = "Select astaCol1, astaCol2, astaCol3... From AstaTable Where...";
//..
//...
}
//Perform data manipulation on astavars...
public void AstaSaysGaaGaa(){
[removed for sake of brevity]
}
//Perform more data manipulation on astavars...
public void AstaSaysGooGoO(){
[removed for sake of brevity]
}
public void AstaSaysPersist(){
//JDBC statement to save astavars to DB
String astaSqlStatment = "Update AstaTable set astaCol1 = @astaVar1
, set astaCol2 = @astaVar2
, set astaCol3 = astaCol3...
Where...";
}
}
PS Я изменил настоящее имя авторов, чтобы не вмешиваться в какие-либо споры и т. Д.
Из исходного кода UNIX-версии веб-браузера Netscape, около 1997 года:
/* HP-UX sucks wet farts from dead pigeons' asses */
К сожалению, такие жемчужины были удалены до того, как Moz стал открытым исходным кодом ...
Этот комментарий был в модуле, содержащем интерфейсы, которые использовались для связи между основным приложением и различными сторонними драйверами.
//**************************************
// Dear code maintainer:
//
// This source contains COM interfaces, not to be confused with interfaces
// of any other sort, please do not just willy-nilly add additional methods
// to these interfaces as they are truely immutable, unlike the interfaces
// that other software vendors like Microsoft maintain. IF you need to add
// new functionality, then go thru the trouble of creating a NEW interface
// and implement this functionality on only the objects you need.
//
// While the money is good for fixing all of the problems caused by not
// following the rules, I would rather work on things which actually have
// an impact on the future of the product rather than curse and yell
// obsenities at the screen because someone didn't bother to understand the
// true meaning of IMMUTABLE.
//**************************************
Там был старый код javascript, хотя и неплохо написанный. Затем была строка комментария
// and there is where the dragon lives
с последующим мероприятием 4 человека потратили день, чтобы понять, что он делает. Наконец мы поняли, что он даже не используется и ничего не делает.
-- Comment this later
Это была строка 2 процедуры PL / SQL из 4000+ строк. И единственный комментарий. Спустя 4 года после того, как эта процедура была разработана, потом так и не наступило ...
Однажды я придумал то, что, как я считал, было элегантным решением особенно сложной проблемы, оглядываясь назад, это было немного сложнее, и я довольно часто использовал макропрограммы. Спустя годы я нашел этот комментарий от программиста по обслуживанию.
/* Description: The Total Perspective Vortex derives its picture of the whole Universe on the principle of extrapolated matter analyses. To explain - since every piece of matter in the Universe is in some way affected by every other piece of matter in the Universe, it is in theory possible to extrapolate the whole of creation - every sun, every planet, their orbits, their composition and their economic and social history from, say, one small Macro. The man who invented the Total Perspective Vortex did so basically in order to annoy the IT department. Steve Weet - for that was his name - was a dreamer, a thinker, a speculative philosopher or, as some would have it, a slacker. And they would nag him incessantly about the utterly inordinate amount of time he spent staring out into space, or mulling over the mechanics of Chelsea FC, or doing spectrographic analyses of macros. "Have some sense of proportion!" they would say, sometimes as often as thirty-eight times in a single day. And so he built the Total Perspective Vortex - just to show them. And into one end he plugged the whole of reality as extrapolated from one macro, and into the other end he plugged the IT department: so that when he turned it on they saw in one instant the whole infinity of creation and theirselves in relation to it. To Steve Weet's horror, the shock completely annihilated ' their brains; but to his satisfaction he realized that he had proved conclusively that if life is going to exist in a Universe of this size, then the one thing it cannot afford to have is a sense of proportion. */
catch (Ex as Exception)
{
// oh crap, we should do something.
}
Нет ничего лучше пустого блока catch, чтобы заставить человека почувствовать, что код надежен ...
Чтобы защитить виновных, ценности были изменены
Этот был оставлен подрядчиком, который работал над фрагментом кода, отвечающим за тестирование логинов электронной почты. Мы не поверили, поэтому попробовали, и это был действительный вход в его личный кабинет; мы дважды проверили историю изменений, и у него было две проверки, которые ее редактировали: одна для добавления кода, а вторая - для его комментирования.
Мы добавили изображения, а остальное оставили в покое; другой разработчик решил, что было бы интересно отправлять ему электронные письма от его будущего себя (а-ля The Office), и сказал, что потребовалось почти две полных недели ежедневных писем, прежде чем вход в систему перестал работать.
' ROFL:ROFL:LOL:ROFL:ROFL
' ______/|\____
' L / [] \
' LOL===_ ROFL \_
' L \_______________]
' I I
' /---------------/
'TODO: REMOVE MY INFO AND REPLACE WITH USER CREDENTIALS
'Private TEST_LoginName As String = "[email protected]"
'Private TEST_Password As String = "Humsal892"
'Private TEST_Server As String = "imap.secureserver.net"
Мне больше всего нравится не то, что он это сделал, или то, что он случайно оставил это на месте для проверки, а то, что, когда он вернулся, он просто закомментировал это, а не удалил. Мы бы никогда не посмотрели на исходную версию, если бы никогда не знали, что она там есть :-D
Я вижу это много:
// TODO make this work
Заявление об очевидном?
/** Logger */
private Logger logger = Logger.getLogger();
Несколько лет назад, когда я писал Perl, я добавил эти комментарии вверху и внизу:
# <magic type="voodoo">
...
# </magic>
Следующий парень, который взглянул на это, был не так уж хорош в Perl и потратил некоторое время на поиск документации о том, что делают «магия» и «вуду». С тех пор я пытался добавить больше полезных комментариев ...
Из проекта кода Google:
# This job would be great if it wasn't for the fucking customers.
when :orientation
## Avoid matching gay people with straight people - they hate it, they do, they really do.
query_parameter = "(users.orientation = 'Bi' OR (users.orientation = 'Straight' AND users.gender IN ('#{user.opposite_genders.join('\',\'')}')) OR (users.orientation = 'Gay' AND users.gender IN ('#{user.same_genders.join('\',\'')}')))"
С сайта знакомств ...
В: «Какой самый лучший комментарий в исходном коде вы когда-либо встречали?»
A: Легко - тот, который помог мне решить любую проблему, которая у меня была в то время, а их много!
На втором месте находятся те, которые помогают избежать известных ловушек при новой разработке.
// .==. .==.
// //`^\\ //^`\\
// // ^ ^\(\__/)/^ ^^\\
// //^ ^^ ^/6 6\ ^^ ^ \\
// //^ ^^ ^/( .. )\^ ^ ^ \\
// // ^^ ^/\| v""v |/\^ ^ ^\\
// // ^^/\/ / `~~` \ \/\^ ^\\
// -----------------------------
/// HERE BE DRAGONS
У меня нет доступа к исходному файлу, потому что я больше с ним не работаю, но он был чем-то очень похож на этот рисунок. Это было в верхней части файла, что всегда вызывало проблемы, и мы должны были исправить, но не позволяли тратить время на то, чтобы исправить это по-настоящему. (Университетская политика)
// If you delete the credits, I will fucking kill you.
найдено в модуле joomla.
не знаю, смешно это или грустно ... но у одного стажера, с которым я работал со мной, была эта маленькая жемчужина, чтобы рассчитать цену за единицу
...
// get the units from the form
int numUnits = Integer.parseInt(request.getParameter("num_pieces")); // this break at random times
//price
float price = Float.parseFloat(request.getParameter("price")); // same as above
// Under certain conditions the following code blows up. I don't know those conditions.
float pricePerUnit = price / (float)numUnits;
...
Один мой старый начальник всегда говорил о том, как нам нужно использовать наши собственные продукты для внутренних целей, например: «Ешьте наш собственный корм для собак ...»
Много лет спустя я обнаружил, что в каком-то источнике, который сделал временный коллега, каждая функция, к которой он прикоснулся, помечена тегами:
/* NOT FIT FOR HUMAN CONSUMPTION */
Классический ASP:
'Is it worth it, let me work it'
'I put my thing down, flip it and reverse it'
'Ti esrever dna ti pilf, nwod gniht ym tup I'
NextIP = StrReverse(UserRecordset.Fields.Item(0))
Много лет назад я столкнулся с этим:
/***************************************************************************/ /* deep wizardry. do not touch. */ /* */ /* no seriously. XXXXXX I'm looking at you. If you screw with this again */ /* I will kill you with my swingline stapler. */ /* */ /* ... */
А затем перешел к описанию особенно сложного алгоритма.
// (c) 2000 Applied Magic, Inc.
// Unauthorized use punishable by torture, mutilation, and vivisection.
Ах, я всегда любил этого ...
//open lid
//take sh!t
//close lid
Комментарии для открытия файла, дампа данных, закрытия файла ...
Исходный код продукции:
// Remove this if you wanna be fired
Некоторое время назад наткнулся на:
raise InvalidChild() # e.g. no legs
Это гротеск, поскольку "inwalida" в переводе с польского означает человек с ограниченными возможностями. глупый я :)
Лучший на данный момент:
"This code makes baby Jesus very sad!".
Он ссылался на инициализацию String следующим образом:
String blankSpaces=" "+ //100 whitespaces
" "+ //200 Whitespaces
...
" " //100 whitespaces
Ну вы поняли.
Я говорю подопечному выполнить хотя бы НЕКОТОРЫЕ исключения. Это то, что я получаю взамен при каждом вызове db ....
Catch (Exception e) {
//eat it
}
Честное слово перед Богом:
// This is crap code but it's 3 a.m. and I need to get this working.
Когда я работал на Reuters, в одном из наших обработчиков каналов был комментарий, который заставил некоторых людей подумать, что Всевышний нам помогает ...
// Jesus told me to skip to the end of the message here
Позже мы узнали, что был контакт из Латинской Америки по имени Иисус (HeyZus).
Самый любимый комментарий, который я когда-либо писал:
//the XML returned from this request is *mind-bogglingly* bad. Terrifyingly bad.
//a completed batch looks like this:
//<Batch>batchid=363777811 status=Done dateandtime=09/18/2007 09:53:10 PDT activateditems=335 numberofwarnings=0 itemsnotacivated=17 </Batch>
//and an incomplete batch like:
//<Batch>batchid=363778361 status=In Progress </Batch>
//so we'll just parse each item as a regex. Thanks Amazon.
И да, Amazon действительно возвращает XML вот так.
// Hey, your shoe's untied!
За ним следует какой-то сомнительный код, и в этом коде
// Keep looking! I think it was the other shoe!
Ну наконец то,
// How strange -- I must be seeing things. Anyhow, I'm going to go take a shower, now...
В хорошо известном коммерческом приложении для работы с электронными таблицами DOS:
/* This comment was just added in order to check-in a file that was last
checked in by [Insert Programmer FirstName] "Back-to-the-Future" [Insert
Programmer LastName]. While testing for year 2000 problems, he accidentally
checked-in this file while his machine clock was set forward to the year 2000.
This meant that the source code was always newer than the object file and
compiled every time the code was built. I'm checking this file in again to
fix that. */
Мне больше всего нравится покойный великий Поль Дилашия:
// Author: If this code works, it was written by Paul DiLascia. If not then I don't know who wrote it.
Все ошибки добавлены Дэвидом С. Миллером
В игре, где на этот объект можно наступить, или:
stepOff(); //bitch
/ * А теперь, чтобы все это выглядело наполовину прилично в отсталом сводном брате семейства браузеров, Internet Fucking Explorer * /
// This is a walkaround for bug #7812
Написал один из наших китайских программистов, для которого английский не был родным языком.
Мне эта очень понравилась. Я думаю, что «обходной путь» - почти лучший термин, чем «обходной путь».
Журнал изменений, который я заметил в устаревшем коде
17.05.99 Д ДЖОНС КОММЕНТАРИЙ К КОДУ BLOODY AUZIES (19.02.99)
17.05.99 K ROBINSON BLOODY TEXAN НЕ МОЖЕТ ПРАВИЛЬНО НАПИСАТЬ AUSSIE (КОД НЕ МЕНЯЕТСЯ - ПРОСТО КОММЕНТАРИЙ)
Использование точки с запятой в VB.NET
TextBox2.Visible = True';
For Each row In data.Tables(0).Rows
If row("Customers.Id").ToString <> customerId Then
customerId = row("Customers.ID").ToString';
name = "Customer Name: " & row("Name").ToString & CrLf';
address = "Address: " & row("Address").ToString & CrLf & CrLf';
TextBox2.Text += name & address ';s
End If';
Next';
Еще в начале восьмидесятых я наткнулся на это на ассемблере (цитата по тусклой памяти):
I don't understand how the following bit works, but it worked in the program I stole it from.
Немецкий комментарий в исходном коде, переведенный машиной или очень уставшим человеком + Google
; Rechnen ja ; have faith in yes
Я предполагаю, что оригинал означал «здесь считать правдой» ... но с тех пор я воспринимаю это как мантру своей жизни.
Немного из ядра Linux:
/* Sun, you just can't beat me, you just can't. Stop trying,
* give up. I'm serious, I am going to kick the living shit
* out of you, game over, lights out.
*/
-
/* 2,191 lines of complete and utter shit coming up... */
-
#if 0 /* XXX No fucking way dude... */
Из исходного кода Apache Xalan:
/**
* As Gregor Samsa awoke one morning from uneasy dreams he found himself
* transformed in his bed into a gigantic insect. He was lying on his hard,
* as it were armour plated, back, and if he lifted his head a little he
* could see his big, brown belly divided into stiff, arched segments, on
* top of which the bed quilt could hardly keep in position and was about
* to slide off completely. His numerous legs, which were pitifully thin
* compared to the rest of his bulk, waved helplessly before his eyes.
* "What has happened to me?", he thought. It was no dream....
*/
protected static String DEFAULT_TRANSLET_NAME = "GregorSamsa";
Дополнительная информация о The Daily WTF.
/**
* Returns cookies according to the filters specified.
*
* @return array Cookies! Nom nom nom nom nom.
*/
public function data_getCookies($uid, $name) {
Где-то из facebook api.
Первые две строки файла с именем monitoring.sh:
#!/usr/bin/perl
# perl script disguised as a bash script
Этот я нашел в пакете "twisted" для Python 2.5 (файл tcp.py в строке 371)
# Limit length of buffer to try to send, because some OSes are too
# stupid to do so themselves (ahem windows)
return self.socket.send(buffer(data, 0, self.SEND_LIMIT))
Из классической программы от usenet:
Глубоко внутри кода разработчика аппаратного моделирования Teradyne находится процедура, которая передает целую кучу шестнадцатеричных чисел в вызов SYS $ QIO. Единственный комментарий: «Здесь происходит странное волшебство».
В заголовке файла кода, сильно отредактированного всеми в команде разработчиков:
'Avert your eyes, it may take on other forms!
Старая добрая Фландрия.
Однажды я спросил коллегу, как что-то сделать (забыл, что именно, какие-то непонятные технические требования) с нашей внутренней структурой. Он сказал «легко, посмотрите ЗДЕСЬ», затем открывает файл .java в своем редакторе и показывает мне этот комментарий посреди нескольких страниц кода:
// HERE
Я только что проверил, комментарий все еще есть в этом файле :)
Этот из Xee, браузера изображений.
// At this point, I'd like to take a moment to speak to you about the Adobe PSD format.
// PSD is not a good format. PSD is not even a bad format. Calling it such would be an
// insult to other bad formats, such as PCX or JPEG. No, PSD is an abysmal format. Having
// worked on this code for several weeks now, my hate for PSD has grown to a raging fire
// that burns with the fierce passion of a million suns.
// If there are two different ways of doing something, PSD will do both, in different
// places. It will then make up three more ways no sane human would think of, and do those
// too. PSD makes inconsistency an art form. Why, for instance, did it suddenly decide
// that *these* particular chunks should be aligned to four bytes, and that this alignement
// should *not* be included in the size? Other chunks in other places are either unaligned,
// or aligned with the alignment included in the size. Here, though, it is not included.
// Either one of these three behaviours would be fine. A sane format would pick one. PSD,
// of course, uses all three, and more.
// Trying to get data out of a PSD file is like trying to find something in the attic of
// your eccentric old uncle who died in a freak freshwater shark attack on his 58th
// birthday. That last detail may not be important for the purposes of the simile, but
// at this point I am spending a lot of time imagining amusing fates for the people
// responsible for this Rube Goldberg of a file format.
// Earlier, I tried to get a hold of the latest specs for the PSD file format. To do this,
// I had to apply to them for permission to apply to them to have them consider sending
// me this sacred tome. This would have involved faxing them a copy of some document or
// other, probably signed in blood. I can only imagine that they make this process so
// difficult because they are intensely ashamed of having created this abomination. I
// was naturally not gullible enough to go through with this procedure, but if I had done
// so, I would have printed out every single page of the spec, and set them all on fire.
// Were it within my power, I would gather every single copy of those specs, and launch
// them on a spaceship directly into the sun.
//
// PSD is not my favourite file format.
Я верю в JBoss, где-то была строчка, которая читала
return null; //Not really null
Мне всегда нравилась эта фраза.
Выставка:
return 0; // Happy ending
Приложение B:
int32_t Interpolate1DSignal(
Array1D<float64>::Handle hfInputSamples, // samples to be interpolated
Array1D<float64>::Handle hfInterpolationFilter, // polyphase filter coefficients,
int32_t iFilterInterpolationFactor, // # of "rows" in polyphase filter
int32_t iFilterLength, // Length of each row in filter
float64 fInterpolationFactor, // Factor to interpolate the
// signal by
float64 fTimingOffset, // Offset into the signal (units
// of samples)
Array1D<float64>::Handle hfOutputSamples // left as an exercise for the reader
);
// This will save us ~0.5 sec for every user and please the machine spirits.
Перед очень долгой процедурой :)
На самом деле видел это на днях на каком-то коде, который был написан, когда был крайний срок.
//This was clearly written under duress
// Hard to explain
В конце концов, он тоже сломался. Неудивительно, что это было сложно объяснить
// Added because boss changed his mind : 20020111,20020501,20020820, ...
// Commented out because boss changed his mind : 20020201,20020614,20020908, ...
В сценарии ETL между в основном взломанной базой данных RPG и базой данных SQL Server. У меня было что-то вроде 10 или 20 раз этого комментария ...
Думаю, у меня было что-то в этом роде:
if (case1) { // trivial
...
}
else { // we are screwed
/* fill in later */
}
хорошо, так что я мог бы использовать более сильное слово, чем облажался
В некоторых ассемблерах в конце строки, содержащей &h723
' RIP LVB
(возьми?)
// this error could never happen
А затем - звонок клиента о том, что он видит сообщение об ошибке, что "эта ошибка не может произойти никогда".
/**---------START-----------**/
// IMPLEMENTATION GOES HERE
/**---------END-----------**/
Но кода нет;)
Когда я учился в классе CS в старшей школе, нас учили в обычном классе - без компьютеров. Все наши тесты проводились на бумаге, которую мы сдавали - по одному занятию на листе бумаги. Наш учитель впервые вел класс на C ++ и иногда переключался в режим Pascal на классной доске. Это было неудобно, так как мало кто из нас интересовался изучением Паскаля.
Если работа больше, чем в классе, мы выполняем ее дома и сдаваем распечатки кода и результатов для оценки. Отправив несколько распечаток кода и результатов, мы все вместе поняли, что учитель на самом деле не читал код - только распечатки. Чтобы проверить нашу теорию, я поместил комментарий на 3-й странице моего кода - прямо между объявлениями некоторых классов:
// If you are reading this, please place a checkmark here [ ]
Конечно, я получил его обратно с большой синей буквой «А» спереди и без галочки.
rescue
# silently, we fail
# many validations fade
# like tear drops in rain
end
Это лишь один из многих ...
Нашел это в make-файле
# ===== Never edit below this line. Ever. Or I'll kick your ass. ====
Мой любимый комментарий всех времен использовал мой друг-гей. Ему нравилось отмечать все свои комментарии TODO в VB.NET как
'TODO: Matt Damon
Иногда предоставлялась дополнительная информация, но не обычно.
Фактически это было сделано мной, когда я реализовывал прототип, превращенный в настоящий код:
// Abandon all hope you who needs to debug this
Да, кто-то умнее меня впоследствии реорганизовал код (у него должен был быть хороший финал).
«Этого никогда не будет».
Знаменитые последние слова мой друг ...
Комментарии по Linux
Хороших тут куча ...
Это все комментарии в linux
http://lwn.net/1998/1015/a/f-word.html
Мои любимые:
./arch/sparc/kernel/ptrace.c
/* Fuck me gently with a chainsaw... */
./drivers/scsi/qlogicpti.h
/* Am I fucking pedantic or what? */
Не комментарии к коду, а комментарии SVN к одному и тому же файлу:
Первая фиксация (после десятков других после получения результатов от тестировщиков):
Squashed some IPR mod bugs. The were big and juicy ones, too.
2-я фиксация:
Squashed some more mod bugs. Those are some nasty bugs, them mod bugs...
3rd:
Squashed some more mod bugs. They are like cockroaches: they'll live through a nuclear war.
4th:
Squashed some more John bugs. They too are like cockroaches: they appear anywhere John goes. Wait. That doesn't sound right.
И 5-й:
Same John bug. It didn't die, just played 'possum.
Да, надоел "Исправленный баг".
Мне нравятся некоторые комментарии в GNU binutils. Это от BFD som.c:
/* You'll never believe all this is necessary to handle relocations
for function calls. Having to compute and pack the argument
relocation bits is the real nightmare.
If you're interested in how this works, just forget it. You really
do not want to know about this braindamage. */
Это тоже:
/* Don't ask about these magic sequences. I took them straight
from gas-1.36 which took them from the a.out man page. */
...
/* Keep track of exactly where we are within a particular
space. This is necessary as the braindamaged HPUX
loader will create holes between subspaces *and*
subspace alignments are *NOT* preserved. What a crock. */
Еще один:
/* We will NOT put a fucking timestamp in the header here. Every
time you put it back, I will come in and take it out again. ... */
От газа:
/* Yes this is ugly (storing the broken_word pointer
in the symbol slot). Still, this whole chunk of
code is ugly, and I don't feel like doing anything
about it. Think of it as stubbornness in action. */
Я думаю, это стало вирусным, я обнаружил следующее в демоне (Linux), который не позволяет убийце OOM выбрать его:
/*
* Don't OOM me, bro!
*/
Это было сразу после mlockall (), чтобы предотвратить подкачку процесса, прокомментировал:
/*
* Don't swap me, bro!
*/
/* FIXME This must absolutely be removed before 4.0.7 release
* TODO really remove this */
с тех пор мы выпустили версии 4.0.7, 4.0.8, 4.0.9 и 4.1 ...
Однажды я работал над проектом, где нашел такой комментарий:
// Cabbage fart?
Понятия не имею, что это должно было значить. Просто рад, что моего куба не было рядом с тем, кто его написал.
Что ж, вот один, который я только что совершил:
/* Every time I re-visit this function, I feel like
* I need to take a shower.
*
* Don't get too used to this function, its days are
* numbered.
*/
Кто-то может запустить что-то вроде greatcodecomments.com и заработать немного денег. Однако этот человек не я.
Мой любимый (должен признать, что использовал много раз):
// Yes...I know this is repulsive and stupid.
// But <%CompanyOwnerOrManagerToken%>, not knowing a thing about code,
// demanded I do it anyways. SO, go crap on their desk, not mine.
// K THX BYE
/* Here I sit, Joe broken hearted, came to do some sh*t, but only just started. */
Что касается тяжелой проверки ввода регулярных выражений.
В середине файла JScript из нескольких тысяч строк после совершенно произвольной строки ...
// The world is a happy place.
В заголовке файла XSLT:
DON'T TOUCH THIS SCRIPT -> XSLT is like arcane, black magic
Найдено в JUnit API:
/**
* ...as the moon sets over the early morning Merlin, Oregon
* mountains, our intrepid adventurers type...
*/
public Test createTest(Class theClass, String name) {
...
}
Точно не помню, но идея была примерно такая:
Person p = new Person("John", "Doe", "male");
Collection women = new ArrayList();
women.insert(p.getTail());
Это грязный код;)
// Whoever put this here is an idiot...this doesn't work at all !
Но код все еще там ...
Видно в исходном коде компьютерной игры LucasArts «Эйдолон» (которая сама по себе была странной и дурацкой) ...
// He's dead, Jim!
От парня, который явно наблюдал за Монти Пайтоном:
> // And now, for something completely > // different:
class theLarch {
Только что добавил это сегодня:
// Hardcoded this for time sake ... will make andrew fix later :)
Этот комментарий взят из старого проекта, который мне пришлось отлаживать:
//Haleluya i can go home!
Мне пришлось добавить его к нашему старому механизму правил, основанному на данных, прежде чем я решил заменить его языком сценариев.
/************************************************************
* *
* .=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-. *
* | ______ | *
* | .-" "-. | *
* | / \ | *
* | _ | | _ | *
* | ( \ |, .-. .-. ,| / ) | *
* | > "=._ | )(__/ \__)( | _.=" < | *
* | (_/"=._"=._ |/ /\ \| _.="_.="\_) | *
* | "=._"(_ ^^ _)"_.=" | *
* | "=\__|IIIIII|__/=" | *
* | _.="| \IIIIII/ |"=._ | *
* | _ _.="_.="\ /"=._"=._ _ | *
* | ( \_.="_.=" `--------` "=._"=._/ ) | *
* | > _.=" "=._ < | *
* | (_/ \_) | *
* | | *
* '-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=' *
* *
* LASCIATE OGNI SPERANZA, VOI CH'ENTRATE *
*************************************************************/
Abandon all hope, ye who enter here
.
- person Bobby; 01.10.2010
Из исходного кода UNIX версии 6, около 1975 года:
/* You are not expected to understand this. */
// Fuck.
Это и ...
// This code worked before, but my cat decided to take a trip across my keyboard...
'Do not optimize these next two lines. Compiler bugs lurk.
И они это сделали. Сжатие переменной в выражение во второй строке привело к прыжку в середину кучи и попытке выполнить данные.
THIS PROGRAM HAS CODE THAT DOES NOT MEET STANDARDS
Этот комментарий есть почти в каждой программе, которая у нас есть ....
# absolutely foul heuristic code.
# ..it's dirty, but you want it.
и:
# VERY USEFUL DEBUGGING AID, for when the above all goes pearshaped:
Не комментарий, а атрибут
[ThereBeDragons]
И один я видел в реализации IHttpHandler
//What is this?
public bool IsReusable
{
get{return false;}
}
Это код из моего собственного кода, но он по-прежнему забавный, и я полагаю, что с таким же успехом могу выложить его, потому что он находится в общедоступном SVN.
// These were orginally up and down. When it was clear the names were
// inapplicable, they were renamed to retain the joke.
// Sorry if you were hoping for useful variable names.
quantum strange, charm;
При отладке чужого JavaScript я увидел следующий комментарий:
// Notice: I feel so dirty doing this, but it's the only way to make it cross browser.
Но, читая пост Скотта Хансельмена, я наткнулся на следующую цитату, которая очень хорошо сочетается с комментариями, которые я нашел внутри кода:
Every line of code you write that you feel gross about will ultimately come back to haunt you. Therefore, avoid writing code that makes you feel dirty.
Это забавно :)
// Bad Christian, No cookie
Cookie в этом контексте не относится к cookie браузера.
Это мой самый любимый комментарий.
/// I intend to do this as shittily as possible because there are many better products that will totally blow this out of the water
/// and we don't have them so whatever
Позже в этом файле мы повеселимся, например,
/// sidestep a bug in WCF (that we can't send types across)
/// or, depending on how you look at, this issue is a Feature
И снова позже
if( where == null)//be nice
В крупном инвестиционном банке, который требовал, чтобы все сбои приложений регистрировались и комментировались, я видел
Without a crash
Or mighty bang
The sync disk
Did it's process hang
Я только что наткнулся на это в очень простой тестовой программе на C ++ для класса в колледже.
Я комментировал курс.
В деструкторе ...
// Choose! Choose the form of the Destructor!
// The choice is made! The Traveler has come!
Я обнаружил этот драгоценный камень при просмотре HTML-источника более ранней версии итерация сайта ТВНЗ (из строки 571, если вы подыгрываете дома):
<!-- Hopfully we can do this otherwise the nav is going to be pretty plain and Hong will go postal. -->
// TODO: Drive an ashen stake through the foul heart of this function.
И это была грязная функция. Мне по сей день снятся кошмары об этом.
Ну, это мои, так что WTF - это я, как сказал CodingHorror:
//#region Code for weird cases - do you really want to know?
Однажды я оставил такой комментарий в каком-то ASP:
' Commented out following code, don't delete for when [CustomerName] changes his mind
Так получилось, что [CustomerName] не передумал, но он ДЕЙСТВИТЕЛЬНО имел доступ к веб-серверу, и он ДЕЙСТВИТЕЛЬНО нашел эту строку ...
Я нашел это в поиске кода Google
// Constructs a tuple with 2 elements (fucking idiot, use std::pair instead!)
template <typename T0,typename T1>
inline tuple <T0,T1> make_tuple (const T0& t0,
const T1& t1) {
tuple <T0,T1> t;
t.get<0>() = t0;
t.get<1>() = t1;
return t;
}
// TODO: not this
Написано коллегой над запросом, отчаянно нуждающимся в оптимизации. В его защиту, мы все работали по 70 часов в неделю в течение нескольких месяцев на тот момент ...
// This part is more difficult
Вверху метода.
Это было около 5 строк.
И не очень сложно.
Это был единственный комментарий.
Во всем приложении.
Забавная опечатка, странно подходящая:
assert(0); // should never shit this point
Не совсем комментарий:
DvLog::Log("This silly log message fixes a PSCRIPT5.DLL gpf when printing to Adobe.");
Печально то, что без комментария PSCRIPT5.DLL действительно взорвалась ...
В LKM:
/*
* Dear Richard Stallman,
*
* This one's for you.
*
* Sincerely,
* Me
*
*/
MODULE_LICENSE( "GPL" );
Я недавно видел это:
// вы только что проиграли игру
если вы не знаете, что это за игра: http://en.wikipedia.org/wiki/The_Game_(mind_game) (это очень глупо, но глупо в некотором роде интересно)
// *** drunk -- fix later ***
Еще больше удовольствия с поиском кода Google. ..
Я видел этот код в функции FULL явных странных приведений:
// Since today's CPUs are really fast, this is dedicated to those who said:
// " You can't use Moore's Law as an excuse to write bad software. "
Код был ужасным :)
Перекомпилируем FreeTextBox3 впервые в нашем приложении, потому что нам нужна поддержка IE8 ... И посмотрите, что я нашел:
// IE7 update. this is still bad code, but IE8 is probably a long way off :)
# dont question, i just felt like throwing some globals in
# this is actually quite pointless as youll soon see
позже в коде
#draw the circles (complicated)...dont question
даже позже ...
# complicated process of drawing the circles in a
# somewhat symmetrical, 3-d pattern
# dont question again
и даже позже ...
# will determine if user clicks on die
# i determined these values...dont worry about them
Я обнаружил это при повторном использовании класса PHP, который написал довольно давно. Я до сих пор не могу вспомнить, что там было, и до сих пор не нашел в этом никакого применения ... Я даже не помню, чтобы писал этот комментарий; так что я буквально рассмеялся, когда нашел его.
try
{
// Some database logic
}
catch (Exception $ex)
{
// sure, it looks silly and I honestly cant remember what code used to go here... but i swear i will
// find a use for this code.... eventually....
throw $ex;
}
Некоторые из очень немногих комментариев в более чем 5000 строк кода в одном файле
У меня действительно есть спор с кодировщиком, который защищал свой стиль кодирования ...
Без комментариев!
И не было никаких комментариев; - ) (или очень мало)
К сожалению, это производственный код.
offset=1;
for (i=0;i<=len;i++)
{
if ((i!=0)&&(i<len)) //-3
{
switch(mess[i])
{
case ETX:
case ETB:
case DLE:
buf[offset]=DLE;
offset++;
break;
}
}
buf[offset]=mess[i];
offset++;
}
Обожаю выключатель!
for (n=0;n<offset;n++)
{
Sleep(TR); //Modif A
Sleep(T);//
FWriteFile(hCom,buf+n,1,&dwMot,NULL);
if (ECHO)
FReadFile(hCom,tab,1,&dwMot,NULL);
}
и нет, комментариев, поясняющих, что такое "modif A" в шапке, нет.
if (GetFileSize(hSlotFile,NULL)==3600) //5*720
а что 720?
Изучая уровень аппаратной абстракции, работая на одного финского производителя оборудования для мобильных сетей, я обнаружил более 100 случаев финского слова «пуукко».
Пуукко - это универсальный нож, который есть у каждого финна в ящике для инструментов или дома. Его используют для всего, от чистки картофеля до ремонта компьютеров (мои наблюдения). Я считаю, что в этом контексте это финский эквивалент слова «взломать».
Мои финские коллеги отрицали это и сказали, что это означает нечто большее, чем «хирургическая процедура / вмешательство» ... и я почти поверил им, пока не нашел комментарий:
/* Perkele ISO Puukko! */ -> Fucking Big Hack!
Я только что закончил колледж и очень хотел запачкать руки. Моей первой задачей было ... "прокомментировать этот код для меня".
Подонок.
Через некоторое время мне это наскучило ...
// this function doesn't actually calculated the profit, like it says --it really signals the mothership orbiting saturn that the planet is ripe for takeover
[later]
// I don't think anyone is going to read this
[various permutations on that last one]
Через несколько часов после того, как я показал другу этот пост из Coding Horror, я увидел это прокомментируйте его код:
// Мистер Валдез - жестокий психопат. Не зли его.
После того, как меня заставили писать модульные тесты для анемичных объектов домена, которые представляют собой не что иное, как мешки геттеров и сеттеров (которые я тоже был вынужден написать):
// zzzzZZZZzzzz....
У меня больше нет точного пакета кода, но я отчетливо помню комментарий.
// The code below needs to be changed immediately.
// I wish I was a little bit taller
// I wish I was a baller
// I wish I had a girl who looked good, I would call her.
Из класса модульного тестирования на C #:
#region quis custodiet ipsos custodes?
[Fact]
public void TestPositive()
{
Assert.Equal(4, 2 + 2);
}
[Fact]
public void TestNegative()
{
Assert.Equal(5, 2 + 2);
}
#endregion
Это было для настраиваемого DHCP-сервера, который мы использовали в общежитиях университета для помещения компьютеров в пулы «чистых» или «грязных» IP-адресов в зависимости от того, зарегистрированы / установлены ли они исправления и антивирус:
public boolean getDirty (String MAC) // not as fun as it sounds
Вся эта функция довольно хороша (из драйвера Linux sunhme.c для сетевой карты, получившей от Sun прозвище Happy Meal. Потому что карта, которая была до этого, была «Big MAC». Поняли? Поняли?)
static void happy_meal_tcvr_write(struct happy_meal *hp,
void __iomem *tregs, int reg,
unsigned short value)
{
int tries = TCVR_WRITE_TRIES;
ASD(("happy_meal_tcvr_write: reg=0x%02x value=%04x\n", reg, value));
/* Welcome to Sun Microsystems, can I take your order please? */
if (!(hp->happy_flags & HFLAG_FENABLE)) {
happy_meal_bb_write(hp, tregs, reg, value);
return;
}
/* Would you like fries with that? */
hme_write32(hp, tregs + TCVR_FRAME,
(FRAME_WRITE | (hp->paddr << 23) |
((reg & 0xff) << 18) | (value & 0xffff)));
while (!(hme_read32(hp, tregs + TCVR_FRAME) & 0x10000) && --tries)
udelay(20);
/* Anything else? */
if (!tries)
printk(KERN_ERR "happy meal: Aieee, transceiver MIF write bolixed\n");
/* Fifty-two cents is your change, have a nice day. */
}
// TODO: what the hell is this all about?
А затем закомментированный код.
Это было обнаружено в нашем коде в работе ранее сегодня. Я не уверен, смеяться мне или плакать ...
Ctrl + A, перезаписать
Это был комментарий, добавленный в систему управления версиями к предыдущему проекту в качестве комментария возврата.
Я когда-то работал над исходным кодом Windows 3.0. (Нет, я спешу добавить, как сотрудник Microsoft!) Там я наткнулся на загрузчик файлов, который возвращался несколько раз, и у меня был один пример неприятного каламбура (просто чтобы показать, насколько умным был автор).
Этот беспорядок реентерабельного кода был выполнен с помощью инструкции jmp сборки Intel (в середине кода C), которая перешла на метку "we_are_not_in_kansas_any_more_toto"
.
-- Change Log: Not needed. The code is perfect 'cause I wrote it.
-- If you change it, it will break.
Я просматриваю некоторые комментарии к коду, чтобы убедиться, что они имеют смысл, и увидел скромную строку выше.
//Iterate by one
$i++;
К сожалению, это было мое, во время моей фазы «Все должны комментировать».
Работая над некоторыми веб-сайтами, я обнаружил следующее при запуске встроенного JS:
Я чувствую себя таким грязным, делая это, но парень хотел, чтобы это было в .NET
УЖАСНЫЙ патч для декодирования (перевод на итальянский язык):
/**
*@return the value
*@param key: the id of the list of instruments
*@PS this function is a violation of all the laws of the
*software engineering,
*commons sense, highway code
*and ONU decision about the coding.
That sh*t...
*/
Только что нашел это в нашем PHP-коде.
$s=2; // chicken and bacon wrap for lunch
Насколько полезно, к счастью, $ s не требует пояснений
удалось вставить этот плохой каламбур в наш код
for (bo_thans = 0 ; bo_thans < MAX ; bo_thans++)
{
if(rs == thing[bo_thans])
{
found = true;
}
}
if(!found)
{
/* Failed to find rs with bo_thans */
...
}
От подрядчика в заявке для банка Великобритании.
// i don't know how this works but it does so i'll leave it here anyway
Он также добавил BNP (очень правую британскую партию) в качестве одного из фиктивных клиентов для тестирования ... наш непосредственный начальник был азиатского происхождения.
<!-- Here it is -->
Других комментариев нигде нет. По сей день я не знаю, что «это» было.
У меня нет кода, которым можно поделиться, но представьте себе этот сценарий. Примерно через месяц или два после того, как наш системный администратор Linux ушел на более зеленые пастбища, я имел удовольствие открыть сценарий оболочки, который он написал. Не могу вспомнить, зачем мне это нужно было редактировать, но дело не в этом. Важно то, что в сценарии было около 40 строк. Я прокрутил комментарий (из них было 37 строк), чтобы добраться до фактического рабочего кода (3 строки). Код был отличным, но мне было любопытно - почему 37 строк комментариев? Итак, я прокрутил вверх и приступил к чтению. К моему удивлению, комментарий был рассказом о том, что делают три строки кода и как это изменить. Лучшая часть - это была частичная копия Nothing But A G Thing доктора Дре и Snoop D O DOUBLE G. Спасибо, Брайан!
Мне больше всего нравится документация в форма лимерика:
Subclassing made Zope and TR
much harder to work with by far.
So before you inherit,
be sure to declare it
Adapter, not PyObject*
Это, вероятно, немного портит шутку, но, поскольку это немного неясно, я объясню:
«TR» здесь относится к «Искаженной реальности». Zope 2 и исходный пакет twisted.reality
широко и неудачно использовали множественное наследование, что могло затруднить понимание того, что происходило, когда вы видели вызов метода. Zope 3, сам Twisted и последователи twisted.reality
(включая самые последние, Imaginary) в целом предпочитают компонентный состав.
Это намного приятнее, чем пугающие юридические уведомления и заявления об отказе от ответственности, которые вы видите в заголовках многих комментариев. Из SQLite.
/*
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
**
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
У нас был групповой проект по созданию ИИ Connect 4 с использованием деревьев Min-Max. В нашей функции оценки ходов мы просили ее вычислить оценку для доски, и над этим блоком кода был такой комментарий:
// This is kind of almost useless
Но становится лучше. Наш инструктор дал нам образец кода из грубого искусственного интеллекта, который он сделал, и оставил отличный комментарий:
// We also add/subtract some points based on what's going on, on the bottom
// row. (I think this is retarded, but apparently when I coded this up
// back in 1999 I didn't.)
моим любимым было что-то вроде этого
# commented out ... ### end of the formerly uncommented #2001-02-22 John Doe
Я просто столкнулся с этим в своем собственном коде. Это было в шаблоне администратора Magento для выбора категории:
/*
* OK; before you read the following code know what I am trying to do.
* I needed to get the list of child catagories from the root node so that
* the root node didn't appear in the selection box. But for some stupid
* fucking reason the stupid fucking DBA wont let me access the items using
* indicies and I instead have to use their stupid fucking Iterator
* implementation. So there.
*/
$firstList = $this->getRootNode()->getChildren();
foreach ($firstList as $node)
{
$nodes = $node->getChildren();
break; // wtf?
}
Я, конечно же, уберу язык из нашего флагманского продукта; но я помню, что был очень расстроен. Если бы я не оставил комментарий, я бы попытался его отредактировать, но затем столкнулся бы с теми же проблемами, что и раньше.
В кучке плохо вырезанных и вставленных исходных кодов веб-приложения для управления контентом:
// load image 1 - JPEG 240x320
img = f1.getImage();
if (check(img))
{
load(img, Constants.JPEG_240x320);
}
// load image 2 - JPEG 128x128
img = f2.getImage();
if (check(img))
{
load(img, Constants.JPEG_128x128);
}
...
// load image 13 - GIF 256x256
img = f13.getImage();
if (check(img))
{
load(img, Constants.GIF256x256);
}
// loaded all of the f**king images
примечание: примерно перевод с итальянского :-)
Из C #
#region Hack - Shield Eyes Before Expanding
/// <summary>
/// A single uint with all of the bits set to represent the different tracing
/// </summary>
/// <remarks>
/// Ugly I know, so if you can think of a better way, feel free to rewrite.
/// </remarks>
[Browsable(false)]
public uint TraceBitfield
{
// Snip
}
#endregion
Я нашел это:
I'm not sure what I did
Не в коде, а в связанной системе отслеживания ошибок:
Это не может быть ошибкой в моем коде. Я очень тщательно его закодировал.
Много лет назад я взял на себя эту работу по поддержке проекта, который работал в режиме реального времени на Z80 и находился на стадии сборки (есть ли другой способ сделать Z80 ??) В любом случае, первоначальным автором был парень из Нигерии по имени Моисей. Может, мне стоит просто остановиться на этом. Во всяком случае, по всему коду было разбросано следующее:
XRA A ;MT
Мне потребовалось некоторое время, чтобы понять, что это было. Сама инструкция не делает ничего, кроме очистки аккумулятора. Это отличный способ, хотя я не уверен, есть в нем преимущество или нет. вы можете просто сделать:
LDA 0
Но возможно
XRA A
сохраняет байт или что-то в этом роде. То, что делает - это эксклюзив или аккумулятор сам с собой. Результат, конечно, всегда нулевой.
Вернуться к МТ - Пусто (понятно?)
Это лучшее, что я встречал.
В классе с именем «Bar» (который был элементом управления пользовательского интерфейса с менее описательным именем) заголовок класса:
/// <summary>I pity the "foo".</summary>
И метод Remove()
:
/// <summary>A "foo" and his money are soon parted.</summary>
Хуже того, это был партнер по бизнесу, который указал на это из сгенерированной документации. Еще хуже то, что это, вероятно, самое близкое к полезной документации, что мы когда-либо получали от этого парня.
Некоторое время назад я наткнулся на какой-то сценарий подключения, и, хотя я не помню синтаксиса, я все же помню комментарии, поскольку я фанат Pink Floyd.
//Attempt Handshake: Hello? This is London calling. Are we reaching you?
//Handshake Failed: I don't understand...he just hung up.
Этот хорошо известен, но мне он нравится (в sys / ufs / ufs_vnops.c):
/*
* A virgin directory (no blushing please).
*/
в дереве исходных текстов ядра FreeBSD (и даже раньше, обратно в 4.xBSD)
// but the "real" solution is much more complicated
из jpgraph
/* logic */
#ifndef TRUE
# define TRUE 1
#endif /* TRUE */
#ifndef FALSE
# define FALSE 0
#endif /* FALSE */
#define EOF_OK TRUE
#define EOF_NOT_OK FALSE
и остальная часть великолепного mkentry.c на страница IOCCC. Я не могу смеяться каждый раз, когда читаю этот источник.
Остерегайтесь ошибок в приведенном выше коде; Я только доказал, что это правильно, а не пробовал.
Это Дональд Кнут.
' Oh man I'm pissed. I think I better go home.
где злой = пьяный
Я не сталкивался с этим на собственном опыте, но это хорошая история (см. Объяснение в моем комментарии):
#define MSGTAG_B33R 0x723 /* RIPLVB */
Из устаревшего сценария Perl CGI:
# This is convoluted and evil, sorry.
Этот был забавным для других, но не для меня. Я унаследовал код (который был ASP) от разработчика, который сам унаследовал его. Первый программист создал очень сложный для понимания код. Второй разработчик добавил следующий комментарий (имена скрыты, чтобы защитить не столь уж невинных):
'This code was written by **************.
'I haven't a clue what it does. He hasn't a clue what it does.
'Nobody else has a clue what it does or how it does it.
'It is something to do with data but **** knows what.
'The ******* still works so please do not change this code,
'even though it is a complete pile of ****.
Так почему же мне это не показалось забавным? Ну, это был код ASP для интрасети клиента.
... и это был клиент, который выделил мне комментарий.
:-(
#!/usr/bin/sh
# Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
# All Rights Reserved
# THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
# The copyright notice above does not evidence any
# actual or intended publication of such source code.
#ident "@(#)false.sh 1.6 93/01/11 SMI" /* SVr4.0 1.3 */
exit 255
Взято из SunOS 5.9 aka Solaris 9 (/ usr / bin / false)
//too much log will kill you
Этот комментарий я написал сам, когда снизил приоритет некоторых журналов, которые в противном случае записали бы сотни МБ мусора и серьезно подорвали бы производительность приложения.
Я видел это однажды:
//this used to be a comment
public static final void attachListener(Object listener) {
/* ======================= */
// This does nothing, continue searching
/* ======================= */
...
больно со слушателями!
/* Only break the connection if it actually exists. It is important to
* check the timeslot saved in the SOURCE of the disconnect message. */
Я написал этот комментарий и теперь не могу вспомнить, ПОЧЕМУ это важно ...
Смотрите это:
'On Error Goto Hell.
//FIXME: fix this before the 1.0 release
они были на версии 4
Из абсолютно прекрасного проекта, над которым я работал до недавнего времени (да, я признаю, некоторые из них мои, но я не скажу вам, над каким):
if(FAILED(hr))
{
char fuck[256];
sprintf(fuck, "GetBuffer() fucking fucked the fuck: %d", hr);
MessageBoxA(0, fuck, fuck, MB_OK | MB_ICONERROR);
return;
}
// This is for Chris, since he gets all hot and horny over "uint" instead of "unsigned int"
// ... or maybe he's just a lazy fuck. Who knows!?
using Ogre::uint;
// movable texts, fucktory
MovableObjectTextFactory* m_pMovableObjectTextFactory;
// diarrhea... shitting CR from the string. complete run...
Он имел в виду, что разбивает строку возвратами каретки для отдельного рендеринга.
// unlock shit (duh, this comment is useless)
pixelBuffer->unlock();
// :HACK: remove me after demo is shipped
Of course, it's still in there ;)
// it's 4am and I can't think of a decent error message.
// my lead just fell asleep at his desk, so I can't ask him.
// [name] went home because he didn't want to get divorced.
// and so it's little ol' me, sitting here, comin up with an
// error message for something that should never ever happen.
ASSERT0(in_len == max_in, "http://www.youtube.com/watch?v=oHg5SJYRHA0");
// you want hungarian, you GET hungarian!
for(int fcknglpidxcntvrI = 0; fcknglpidxcntvrI < len; fcknglpidxcntvrI++)
bool bKillSomethingAlive = false; // beating the dead horse instead
Конечно, у нас также есть хорошая коллекция интересных способов сказать «взломать»:
// HACKOMATIC
// HMM... HACKXOR?
// HACK'O'ROONY
// AR; yeah I know it's HACKsoup
// HACK SHOT! DOMINATING!
// HACK'KIDO
// HACKku. sepukku. harakiri. kamikaze. ninja.
// HACK'o'NEIL
// HACKsaw
в конце довольно длинного и запутанного набора циклов while и блоков if соответствующий разработчик вставил последний комментарий:
else
{
// wobbly wilson said this would *never* happen!!
}
лаконичная смесь остроумия и сарказма :)
BerkeleyDB
/*
* Chaos reigns within.
* Reflect, repent, and reboot.
* Order shall return.
*/
return (DB_RUNRECOVERY);
Строго говоря, это не комментарий, но ...
Это была середина 1990-х, и я работал над большим переходом: небольшой поставщик программного обеспечения, большой клиент, большое давление. У нас было много вещей со смещением ворот; проект было очень трудно контролировать. Я был ключевым разработчиком, но новичком в системе, а другой разработчик был владельцем / основателем поставщика.
После нескольких месяцев, когда не совсем уложились сроки и не совсем удовлетворили клиента, владелец / основатель пригласил другого разработчика, который работал удаленно. (Я рискну и скажу, что у нового разработчика меньше навыков и опыта, чем у меня.)
Что ж, новый парень внес некоторые изменения в код, над которым я уже работал, а через месяц или два я вернулся в ту же часть кода, и там были переменные, которых я раньше не видел. С такими именами, как StupidMark
.
Чувак, это просто неправильно. Я имею в виду, есть соображения совместной работы, но также: в этой среде имена переменных могут отображаться в сообщениях об ошибках времени выполнения. Я просто говорю.
На мой взгляд, в то время код нового парня в любом случае не приближал нас к готовому продукту, что еще больше раздражало.
// this is really complicated
без других комментариев
первая строка функции javascript:
// this part is more difficult
Какого черта?
В основном коде триггера для транзакций в базе данных OLTP:
-- This line negates the @inverseqty, which is the
-- negative of the @insertedquantity. This works through the
-- magic of the trigger. In fact, this code is a lot like
-- the bermuda triangle!
@negquantity = -1 * @inverseqty
Несколько лет назад я работал с большой базой кода, о которой не приходилось говорить о модульном тестировании.
Глубоко в коде был скрыт метод, который выполнял некоторые календарные вычисления. Он был несколько сломан, из-за каких-то неудачных обстоятельств приходилось очень неуклюже справляться с переходом на летнее время.
Пару раз приходилось исправлять, и каждый раз через несколько месяцев мы обнаруживали, что что-то сломалось.
Потратив целый день на исправление и анализ, я поместил код в систему управления версиями вместе с комментарием, в котором говорилось что-то вроде этого:
// this code was written after a version trying to do {this} failed because of {reason},
// previously we were doing {this} which failed because of {reason}. This is
// now written {this} way so that {lots of reasons here}. If you want to touch
// this code, please make sure that it produces the right answers when tested with:
//
// {some sort of unit test}
В конечном итоге моя команда была отдана на аутсорсинг. Иногда мне интересно, что случилось с этим кодом :)
Я только что нашел это в пользовательском провайдере Linq для .net:
//select is a royal pain in the ass where
//the parameter passed to CreateQuery isn't actually the one that goes in the call
//requiring this workaround. Not sure how straight Linq to Objects does it.
И этот
//expressions have to be compiled in order to work with the method call on
//straight Enumerable somehow, LINQ to objects itself magically does this.
//Reflector shows a mess, so I (Aaron) invented my own way. God love unit tests!
И я только что нашел этот ... он только поправляется
//ok, this is a hairy, dirty, and nasty piece of code
//the alternatives are substantially worse than this though
//i.e. when you do your own provider, LINQ assumes that
//you are going to implement your own expression tree visitor and
//do it all yourself. Frankly, I still have xmas shopping to do
//and I really don't want us to be foobared when we get
//even more extension methods added to LINQ
//therefore, we are pulling execute based on taking the calling the
//standard execute on enumerable, but using our own class
//
//optimization can occur from here on an as needed basis, that is
//check for the value of mex.Method.Name, and write a handler for
//that method
//
//also, it may not be a bad idea to rather than do this reflection
//each and every time somehow cache the reflected methodinfos and do
//lookups that way that said, we need a complete red/green/refactor
//cycle here before I am touching that one
И этот
//Compile that mutherf-ker, invoke it, and get the resulting hash
Это был единственный комментарий, который мы нашли в продукте для смарт-карт, который купил предыдущий работодатель. Загрузка встроенного C и ассемблера, написанная группой голландских докторов наук по криптографии
// echt halmaal gek - no way!
(Это означает что-то вроде "действительно совершенно глупый" ... что нам тоже не помогло)
То, что я видел в файле .h много лет назад.
// It may be a hack, but it works.
То, что я увидел в программе на COBOL, парализовало меня страхом
* All comments pertain to the lines which follow.
Что это значит?
Кому-то было так неудобно комментировать, что пришлось написать мета-комментарий?
Кто-то имел обыкновение помещать комментарии ниже соответствующего кода, и ему сказали разместить комментарии выше? Как это произошло?
Для одного проекта у нас был pwlib в качестве зависимости, и в то время его порт FreeBSD был несколько испорчен, поэтому мне пришлось собрать его вручную из исходников. Не сразу получилось, пришлось заглядывать в код; существовала сложная иерархия классов с частями кода, сгенерированными макросами, а его родительское объявление calss начиналось с
// The root of all evil ... umm classes
Для написанного мной класса шаблона интерфейса оболочки / обработчика memcache у меня был реализован следующий метод.
/**
* Do not use, ever - left in place for testing purposes
*/
function I_David_WillHuntYouDownAndHurtYou_Badly_IfIFindThisUsedAnyWhereInTheAppLibrary(){
...
}
По сути, это была функция super nuke, которая сообщала всем отдельным службам кэша памяти полностью очистить себя и начать с отдельных счетчиков пространства имен, которые я использовал для ключей (например, {_ counter_key value} _. {_ Counter_key value})
Еще одна небольшая новелла, которую я написал, касалась автоматизированного загрузчика для поставщика данных, в котором подробно описывалась, насколько я ненавидел этого поставщика и дошел до того, что постулировал, что пакетная система их инфраструктуры управляется песчанкой, работающей на колесе и после стольких оборотов колеса будет запущена следующая задача в очереди. Он был написан в течение 6 месяцев с добавлением дополнительной обработки исключений, таких проверок, как (если мы получили 768 байтов символов \ s, это означает, что запрос к их БД истек, а пробелы являются результатом пустых операторов печати с ошибками.
try
{
...
}
catch(Exception ex)
{
//if this happens the world is going to end...
}
теперь угадай, что случилось ...
# let's pretend we are free, for a while
Нашел это перед классом. За этим последовала (наивная) попытка реализовать ORM. Я до сих пор не понимаю, зачем он это написал.
// haack, phil haack
и:
/* hack, hack, hack, hack, hack hack, hack, hack
* hackity hack, oh wonderful hacks
* wonderful hacks, oh wonderful hack, hack, hack
* hack hack hack... and spam
*/
РЕДАКТИРОВАТЬ: только что нашел это в моем коде (проект желает остаться анонимным):
// yikes, we need to:
/*
* o
* -|- < US CROSSING PLATFORM
* |\
************************************************
* | ^ PLATFORM |
* | T |
* | TROLL^ |
*/
// right now:
/*
* o ./_ |
* -|-[]\ | (_'_) () (\) | ) \|/ (S) < WALL
* |\ | ^ FRIENDLY MESSAGE FROM YOUR FRIENDS AT MICROSOFT
* ***********************************************
* | ^PLATFORM |
* ^ SPRAY CAN (IN HAND)
*/
public static class DefaultFonts
{
public static string SansSerifPath
{
get { return @"C:\Windows\Fonts\arial.ttf"; }
}
public static string SerifPath
{
get { return @"C:\Windows\Fonts\times.ttf"; }
}
public static string MonospacePath
{
get { return @"C:\Windows\Fonts\courier.ttf"; }
}
}
Как я люблю каламбуры.
Я плакал, когда читал это о проекте, который мне поручили поддерживать.
//Write Code Here
Я все еще съеживаюсь :)
Наша команда только сегодня вечером выпустила новую версию файла CSS, в котором были удалены комментарии из файла, который был структурирован следующим образом:
@charset "UTF-8";
/* Who knew comments here could COMPLETELY ruin our page in Safari? */
body {
/* Really important stuff here */
/* Of course, comment or not, this will all get ignored by Safari because
its the first rule after the comments which break everything.
see http://www.w3.org/International/questions/qa-css-charset for the exact details!
*/
}
Самое забавное, что в сети вы найдете решения людей - просто ввести поддельный элемент в качестве первого правила под оператором кодировки, чтобы его проигнорировали и продолжили как обычно ...
Пища для размышлений: где поставить комментарий, чтобы не комментировать?
Примечание: я знаю, что в этом нет необходимости из-за заголовков, мета-правил и т. Д. К сожалению, нам это нужно как уловка :(
Череп и скрещенные кости в стиле ascii (которые здесь слишком сложно воссоздать) в Emacs Гослинга. (предупреждение о том, что написанный им пакет для управления сверхгорячим экраном нелегко понять).
Замечено в каком-то COBOL еще в 1983 году:
C I don't know what this next bit does so I'll jump around it
GOTO DONE.
У Денниса М. Ричи есть страница о некоторых древних комментариях UNIX здесь а>
Я только что проверил это на днях ...
/// <STERNLY-WORDED-WARNING>
/// Pay attention to this or I will hunt you down.
/// ...
/// </STERNLY-WORDED-WARNING>
Где ("..." == "проприетарный материал, который я не могу опубликовать"). Мне просто понравился мой элемент СТРОГО-СЛОВО-ПРЕДУПРЕЖДЕНИЕ.
Из Joomla! источник:
// this is daggy??
Как только я нашел это:
// I wish (boss name) could do this by him self.
Это мой комментарий, который я нашел сегодня при рефакторинге кода.
if( year < 100 ): year += 2000 #lol, Y2K
// The hackiest hack that ever did hack
Он находится в движке блогов WordPress (wp-admin / includes / user.php - если кто-то действительно хочет увидеть хакерский взломать сам).
Я только что нашел это в каком-то ActionScript, который мне нужно обновить ...
/*
* spaghetty code in this module.
* hardcoded variables for load paths for the content window.
* Needs (vast) improvement.
*/
..отличный :(
Классика из старого кода Netscape Mozilla. Лично мне нравится
просто не могу бездельничать. О, еще трогательная память в любом случае обречет нас, и все это будет чертовски сложно понять. Итак, я сдаюсь, Mac просто полностью отстой полные камни
но есть много других забавных.
Еще в колледже:
//why the f*** we have to move this here to make it work
Это было выделено в печатном источнике, когда мы пошли на обзор с профессором.
Причина: какая-то действительно неприятная ошибка, связанная с переполнением буфера, которая затронула несвязанную переменную с обработчиком файла в другом месте кода. Перемещение переменной заставит ее снова работать.
В инструменте экспорта художественных активов я наткнулся на полный переводчик цифровых (арабских) чисел в римские числа. Выглядело это так:
/*
//You can tell I was bored
//I wanted to do this for a long time
char* ConvertToRoman(int number, int base)
{
... whole code here
}
*/
Команда человека, написавшего этот код, долгое время ломала голову, я думаю, это повлияло на их здравомыслие.
Комментарий в нашей системе корпоративного класса, используемой для государственных нужд
'RH 5/24/06 burn me if this dosn't work.. :)
Хороший оле РХ ..... компания Prez / ведущий разработчик
Лучший комментарий, который я когда-либо видел, был
/*
There is no accounting for pointers
*/
http://fxr.watson.org/fxr/source/pci/if_rl.c - источник хороших.
//Do not continue reading if you dont want to die.
Этот чуть не убил меня.
Из файла конфигурации sendmail. После страниц и страниц того, что выглядело просто линейным шумом. Я нашел эту жемчужину.
# insert this handy debugging line wherever you have problems
#R$* $:$>99$1
Однажды мне позвонил клиент через несколько лет после работы над большой бюджетной системой, написанной на Paradox 3.5.
«Мы столкнулись с небольшими комментариями, которые возникли во время отладки» -
// This shouldn't happen, if it does, then the bits that automagically
// worked when I wrote it have stopped working
... !
// for 8 or 12 threads this does not affect much.
// Strange are the situations if not understood properly.
// Yoda strikes again
В многопоточном модуле! :)
Найдено по сложному коду -
// У Иисуса и этого кода есть одна общая черта: оба были воскрешены
Из Python / ceval.c:
/* This is gonna seem *real weird*, but if you put some other code between
PyEval_EvalFrame() and PyEval_EvalCodeEx() you will need to adjust
the test in the if statements in Misc/gdbinit (pystack and pystackv). */
Приведенный ниже код был замечен в учебном пособии по Python.
# This is my rifle.
def rifle(type='hunting'):
print('This is my (%s) rifle.' % type)
# This is my gun.
def gun(type='hand'):
print('This is my (%s) gun.' % type)
# This is for fighting.
def fighting(type='illegal'):
print('This is for (%s) fighting.' % type)
# This is for fun.
def fun(type='gaming'):
print('This is for (%s) fun.' % type)
Автор, должно быть, был поклонником Family Guy. ^ _ ^
Я только что закончил работу с фреймворком (который использует Trace, я не знаю, почему ничего подобного не существует). Я создал удобный базовый класс, унаследованный от TraceListener. Он переопределяет все методы TraceListener и направляет их в один метод, так что комментариев много:
// TODO: Need some codemonkey to doc comment this class.
Сборник моих лучших хитов:
// Thats the end of the While loop
// Clean up last row. I really must program better than this.
// Note: You can't immediately tell if the line below works.
// Rounding - blech. It's assumed that all .5s are rounded up.
// Sort out predictions first. Seems like the right place for a prediction, 'first'.
// Let's interpret!
В каком-то действительно дрянном коде vb (я знаю, что все дерьмово, но) я нашел этот комментарий в пустом блоке управления if, в котором говорится что-то вроде:
If bFound Then
'I love it when I write kick ass code like this
Else
.
.
-- Beyond this point, there'll be dragons
Я нахожу это более иллюстративным с более длинным высказыванием ^^
Get This hack!
В строке кода ассемблера после страниц кода без комментариев.
В SJ CA на заре аукционного бизнеса я работал с парнем по имени Рик Дорин. Он написал компиляторы, когда приходилось целый день тыкать в карты. Одно из его сообщений об ошибке было
Слишком много ошибок ... Делайте меньше!
Примерно в то время, когда игра Hitchhiker's Guide была новой, у меня был случай, когда я проверял, было ли что-то прокручиваемым и пытался ли пользователь прокручивать, на языке, который ограничивал переменную длину. Так:
if (scroll and noScroll) # or tea and no tea
DataRow[] foundrows = FilterCalendarEntriesBecauseDotNETIsFuckedUp(tbtemp,CalDate);
Не комментарий, а интересное название функции
я нашел это
// This is a kind of magic...
В ранней версии PeopleSoft Financials PeopleCode:
/* I don't know how you can ever get here so I'll have to fix it later */
// Jay knows what's going on here, but will he remember in a year? Not very likely, this code sucks, but it works so do not change it.
Этот комментарий был размещен над огромным блоком while-if-for ... О, и он манипулировал массивом объектов объектных массивов объектных массивов строк, которые могут быть строками или числами, в зависимости от как минимум 3 факторов ... (да , Мне пришлось отладить этот код и изменить его, и я написал комментарий, однако я не писал исходный код). ;)
Я часто находил это
// fix it!
// Приведенный ниже код необходимо закомментировать.
вот 4, в произвольном порядке:
// Father, forgive me, for I am sinning
// heaven help me
// horse string-length into correctitude
(from a textbook)
// what, me worry?
Хороший в VB.NET, с которым я столкнулся сегодня утром, рассмеялся ...
''' <summary>
''' Represents an exception that was logged. Since System.Exception implements IDictionary, it can't be
''' serialized, so I had to write this. Pretty fucking stupid thing to have to do, System.Exception should
''' be serializable right out of the box, IMHO.
''' </summary>
''' <remarks></remarks>
Public Class LogException
я только что заметил, что пишу это
// not brilliant solution, but fair enough heh.
Я унаследовал проект, который был доставлен заказчику без UAT. Его перебросили через забор и потребовали деньги.
В первый раз, когда они его использовали, он, естественно, взорвался. Это была промежуточная библиотека, которая перекрывала любые системные вызовы, которые принимали имя файла в качестве параметра, а не дескриптор файла.
Многие системные вызовы были забыты.
Когда я попал на борт, код был пронизан такими жемчужинами, как:
/* core dumps around here but this is hardly ever called */
и
/* don't know why this works but it seeems to be ok */
Да, и никаких юнит-тестов не было. Коллега начал добавлять недостающие системные вызовы и модульные тесты.
И ублюдки, которые написали код, все еще были в команде, и их совершенно не заботил доставленный мусор!
Fix problem where Nulls don't work properly. Stupid Microsoft!
Код конвертировал Null в строки нулевой длины построчно окольным путем, потому что глупый программист не понимал, что такое Null, и никогда не слышал о функции Nz ().
// GK Experimental
(GK - инициалы кодировщика)
Используется для обозначения частей кода, которые действительно являются экспериментальными. :)
Отличный флаг, чтобы знать, что если вы нажмете его во время отладки, вы, вероятно, будете заняты в ближайшие несколько часов исправлением взлома ..;)
В большом проекте, над которым я работал, использовались StyleCop и FXCop в автоматизированной сборке с правилами, чтобы люди не проверяли код с раскомментированными полями, методами, свойствами и т. Д. И т. Д.
Кто-то так разозлился на необходимость добавлять комментарии типа «Получает или задает полное имя» к самодокументированным свойствам, таким как FullName, что они приложили усилия для написания макрос для обхода правил.
Макрос вставил сводные теги XML для методов, свойств и т. Д. С одним не отображаемым символом Unicode в качестве содержимого тега, который обманул бы правила сборки, одновременно нанося свой небольшой удар по бездумной настойчивости комментировать материал ради этого ...
... по крайней мере, до тех пор, пока они не введут другое правило для проверки символов Юникода в комментариях.
Рядом с верхней частью юнита:
// Oh what a tangled web we weave
// When first we practice to deceive
// ASTA
/* Hammer Time! */
Понятия не имею, почему и были ли на нем нейлоновые парашютные штаны рипстоп при написании кода
Когда-то в начале 1980-х мы писали код финансового моделирования для утилит на PL / I. Получил звонок от клиента с взрывающимся кодом сразу после комментария
/* Honest this works */
Этот парень взял наш стандартный набор финансовых уравнений и сделал около 15 страниц алгебры, чтобы объединить кучу кода в одно уравнение. После Три-Майл-Айленда, когда коммунальным предприятиям пришлось списать свои атомные станции с огромными затратами, уравнение не удалось из-за переполнения ФИКСИРОВАННОГО БИНА 15 (целочисленного), которого не произошло бы, если бы не возникла алгебра.
Из Joomla! источник:
// fudge the group stuff
Однажды я реализовал некоторый рабочий процесс с документами, используя MS SQL Server Developer 2000 (человеческий рабочий процесс).
Он состоял из набора триггеров, которые добавлялись в базу данных, чтобы она следовала правилам рабочего процесса.
В одном из триггеров кто-то в Microsoft написал что-то вроде:
//Determine if the database has been "Grizzlified"
(Внутреннее название продукта было «Гризли», поэтому я подумал, что это было забавно).
Нашел это недавно в нашем коде (мы разрабатываем корпоративное программное обеспечение):
// Instance of excel
Excel excel = this.CreateExcelInstance();
excel.Open(stream); // how to close it?!
До этого я был уверен, что мы свободны от этой "забавной ерунды" и делаем это правильно и идеологически правильно ...
Однажды у меня работал программист, который поместил комментарии «Стиль» в свой код, где он систематизировал свои внутренние дебаты о конкретных деталях реализации и сделал прощальные снимки, когда он был отвергнут в конкретном решении по кодированию.
Примеры:
«СТИЛЬ» Можно спорить, что лучше, но я передаю дескриптор изображения, а не просто «передаю значения масштабирования, чтобы упростить вызывающий код» (с помощью «пары операторов объявлений»). В качестве альтернативы я мог бы передать эти элементы данных непосредственно из вызывающего кода, но это нарушило бы инкапсуляцию.
«СТИЛЬ». Как и в другом месте, я зарегистрирую свой официальный протест (просто дайте мне «формы для заполнения») относительно реализации сериализации аннотаций как «свойство, а не пару Load / Способы сохранения. Опять же, это, вероятно, вопрос стиля и в высшей степени спорный.
'this next if statement - just how it is. don't try to understand it because you won't. :)
Это гарантия работы прямо здесь.
В eMule Preferences.cpp, в методе, который устанавливает минимальное ограничение скорости загрузки, пропорциональное вашему пределу скорости загрузки:
uint16 CPreferences::GetMaxDownload(){
//dont be a Lam3r :)
uint16 maxup=(GetMaxUpload()==UNLIMITED)?GetMaxGraphUploadRate():GetMaxUpload();
if( maxup < 4 )
return (( (maxup < 10) && (maxup*3 < prefs->maxdownload) )? maxup*3 : prefs->maxdownload);
return (( (maxup < 10) && (maxup*4 < prefs->maxdownload) )? maxup*4 : prefs->maxdownload);
}
У нас есть файл, и на полпути к нему программист, пытающийся разобраться в беспорядке, сумел переместить весь бессмысленный код в конец и оставил комментарий примерно так:
I have no idea what this stuff does below here.
Другой программист оставил серию вложенных пространств имен, которые действовали как путеводитель, чтобы вы могли углубиться в пространства имен в идее и выбрать свои действия.
Когда я комментирую куски кода, которые, как я ДУМАЮ, больше не бесполезны, но могу ошибаться (следовательно, не удаляю их), я иногда ставлю перед ними предисловие
// Wilted celery?
Идея в том, что это похоже на увядший сельдерей, но вы все равно кладете его обратно в холодильник. Я просто знаю, что через 10 лет кто-нибудь еще найдет эти комментарии и скажет «ЧТО?»
Вот некоторые из них, которые я вставлял в свой код в разное время. Некоторые технически не являются комментариями, но представляют собой те же концепции.
В кроссплатформенном проекте, которому нужен специальный код только на одной платформе:
//If defined, will include all the Windows-specific code.
#define LOSE
#ifdef LOSE
#include <windows.h> //WIN32. Duh.
#endif
---------------------------------------------------
//Stolen from other_project_name.cpp
---------------------------------------------------
/*
* These comments have been lifted from propagate() and, though they no longer apply to the code, they may still be of value somewhere. Original tabbing and structural elements have been preserved.
*/
//CAUTION: This has a major Bobby Tables risk. Even if a rulebuilder is used, there's still the risk of something getting corrupted in the database itself.
//Reading text from anywhere and simply slotting it into an SQL statement is a major security risk. (With thanks to xkcd for the name "Bobby Tables".)
//Requirement: Eliminate one Bobby Tables by changing [redacted] to be not just straight SQL.
[lots more comments that are not as funny]
/*
* End of lifted comments. There should not be any executable code between these markers.
*/
---------------------------------------------------
/*
Okay. It's unrecognized. Why is this a fatal error? It's actually very closely akin to the miswart of botched #includes being a fatal. When writing a C/C++
program, you need your headers, and if you don't have one, chances are there'll be a million cascaded errors; so by making "unable to open asdf.h" a fatal,
the compiler suppresses all those errors about undefined symbols and potentially misspelled type names.
*/
---------------------------------------------------
//If someone tries to import 'id' as a field name, it won't work. (We already have our own id.) But I think the probability is so low that I can afford to be funny.
if (!stricmp(ptr,"id")) {warn(0,"Import","","'id' is a reserved word and cannot be used as a column name. (Try 'ego' or 'superego'.)"); return;}
---------------------------------------------------
//Need a place to squirrel away SQL statements somewhere
char *uts[1024]; //Unified Temporary Storage. (Why? Because I said so.)
int nuts=0; //What is it that squirrels keep? Ha!
int utsid[sizeof uts/sizeof *uts];
---------------------------------------------------
/**************************************\
* NOTE: This sets tilde.action. If a *
* tilde header does not exist in the *
* import file (not the _content_, if *
* the entire column isn't there), it *
* will duplicate down through all of *
* the rows. This is fine for ~id, as *
* that will never be changed; and if *
* ~Quantity is blank, that throws an *
* error in 'Add'. With ~Action, I am *
* not so certain. I THINK it'd be OK *
* to dup-down most of the time... if *
* the user only ever imports Adds or *
* Revises, but never both at once in *
* a single import. So for safety, to *
* allow a blank ~Action to revise OR *
* add, I'm breaking the check out to *
* a new variable - the curaction. In *
* most cases, it won't be needed, so *
* it's a waste; but it isn't like it *
* has to copy the entire tilde.*, so *
* it's only a small waste. So it can *
* waste a register... big deal. OK ! *
\**************************************/
---------------------------------------------------
//if (!response) // we're going to crash
//if (!items) // we're going to crash
//TODO: Don't crash
---------------------------------------------------
Многие мои комментарии содержат непонятные ссылки на фильмы или мюзиклы, но они не будут такими забавными, если вы не знаете шоу.
/* Look not upon this file lest your eyes be burnt from your head. */
Что я могу сказать? Я был интерном, и лето почти закончилось. Скажем так, у меня не было серьезной приверженности своим обязанностям по документации.
Продезинфицировано:
//Forward declarations:
class X {}; // TODO: Remove {} ! When we get X defined....
У меня нет копии источника, но я всегда ее помнил:
// Если вы не можете понять это, вам не следует это читать
Из источника ядра Linux:
linux / include / asm-i386 / hw_irq.h:
/*
* subtle. orig_eax is used by the signal code to distinct between
* system calls and interrupted 'random user-space'. Thus we have
* to put a negative value into orig_eax here. (the problem is that
* both system calls and IRQs want to have small integer numbers in
* orig_eax, and the syscall code has won the optimization conflict ;)
*
* Subtle as a pigs ear. VY
*/
Найдено в старом скрипте Perl, который генерирует HTML:
# I would be _very_ brain farting if I said this code didn't need reviewing.
# It will make babies cry, and hair grow on your back, so please don't use it
Из /System/Library/Frameworks/AppKit.framework/Versions/C/Headers/NSTextView.h:
- (void)smartInsertForString:(NSString *)pasteString replacingRange:(NSRange)charRangeToReplace beforeString:(NSString **)beforeString afterString:(NSString **)afterString;
- (NSString *)smartInsertBeforeStringForString:(NSString *)pasteString replacingRange:(NSRange)charRangeToReplace;
- (NSString *)smartInsertAfterStringForString:(NSString *)pasteString replacingRange:(NSRange)charRangeToReplace;
/* Java note: The second and third methods are the primitives and are the
methods exposed in Java. The first method calls the other two. All
Objective-C code calls the first method. In either Objective-C or Java any
overriding should be done for the second and third methods, not the first
method. This will all work out correctly with the exception of existing code
that overrides the first method. Existing subclasses that do this will not
have their implementations available to Java developers. Isn't Java wonderful? */
Из http://www.madore.org/~david/computers/callcc.html:
/* Yow! DEMONS are flying through my NOSE! */
Мне действительно нравится тег oh_my_gawd больше, чем комментарий ...
/* * IOC3 is fucked fucked beyond believe ... Don't even give the * generic PCI code a chance to look at it for real ... */ if (cf == (PCI_VENDOR_ID_SGI | (PCI_DEVICE_ID_SGI_IOC3 b_type0_cfg_dev[slot].f[fn].c[where ^ (4 - size)]; if (size == 1) res = get_dbe(*value, (u8 *) addr); else if (size == 2) res = get_dbe(*value, (u16 *) addr); else res = get_dbe(*value, (u32 *) addr); return res ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL; oh_my_gawd: /* * IOC3 is fucked fucked beyond believe ... Don't even give the * generic PCI code a chance to look at the wrong register. */ if ((where >= 0x14 && where = 0x48)) { *value = 0; return PCIBIOS_SUCCESSFUL; }
try {
dataSource.close();
}
catch (SQLException ex) {
// Do nothing, since we're going to trash this anyway
}
Конечно, такого рода вещи на самом деле являются wtf в JDBC (или, по крайней мере, в драйвере JDBC Oracle), поскольку они могут вызывать SQLExceptions при закрытии соединения ...
Технически это не комментарий, а от написания кода примерно в 2 часа ночи:
consent = False
... эта переменная никогда больше не используется НИКОГДА и появляется в начале цикла прослушивания для сокета.
На латыни Abandon hope all ye who enter here
из «Божественной комедии» Данте.
Я только что разместил этот комментарий:
// this control (Resistance) is FUTILE!
Сначала в начале обновления огромного объекта:
/*General note to all who tread in the <ObjectName>() code...
* The SetOriginals() method from the BaseEntity class should be called (and only called) right after the Get() method
* call as seen above. Calling the SetOriginals method elsewhere will result in bugs and all kinds of other nasty suprises.
*/
Затем после примерно 200 строк логики для обновления объекта:
//Attempt to explain this confusing mess of code:
//First time you save an actual absence this is what happens:
//0. The first save saves to the <TableName> table (among other things). (Fig. A)
//1. The <CalculationMethod> method is called next which inserts to the <OtherTableName> table.
//(This is the table that keeps track of credits to the case.) (Fig. B)
//2. So then you have to call <UpdateCalculations> to move the <TableName> records to the <ThirdTableName> table. (Fig. C)
//3. Then you go back and run calculations since you have the debits table (<ThirdTableName>) populated. (Fig D.)
//4. Then a final save to save the calculations back to the case. (Fig. E)
//Yeah, I know what you're thinking: this sucks. 10/01/07 XXX
И разработчик оказался прав ... Это - отстой!
При кодировании приложений MAPPER у нас было несколько стандартов, и один из них заключался в том, что во всем пакете использовался список стандартных переменных. Один из них - «V43» всегда использовался для обозначения фамилии. Итак, представьте мое раздражение, когда меня попросили исправить единственный комментарий в большом загадочном фрагменте кода MAPPER:
Here V43 contains the Surname
Это из старой победившей работы IOCCC, мне пришлось загрузить весь архив победителей - огромные 1,4 Мб - и найти несколько фраз, которые я запомнил неправильно, прежде чем найти его.
Синтаксически это, вероятно, не комментарий. Или, может быть, это так. Я этого не понял. В нем определенно нет разделителей комментариев, но и разделителей строк также нет.
C="Lint says "argument Manual isn't used." What's that
mean?";
Никаких цен на угадывание выхода из линта.
И для любопытных: эта запись находится здесь.
Моим любимым было имя переменной внутри некоторой бизнес-логики школьного проекта, написанного на java.
int StupidJava = -1;
<cftry>
...code...
<cfcatch>
<!--- Gobble --->
</cfcatch>
<cftry>
Это повсюду в кодовой базе моей компании. Это ColdFusion, и он просто игнорирует ошибки.
Хорошо написанный Lisp - один из самых простых для чтения языков, и мне он нравится. Но плохо написанный Lisp может стать кошмаром намного хуже, чем плохой Java и т. Д.
Здесь нам нужно создать «групповой файл», если существует 3 варианта исходного файла с суффиксами a, b и c. Я пытался отследить странную ошибку, из-за которой мы получали ненужные групповые файлы ...
(let ((varianta (format nil "~aa" problem))
(variantb (format nil "~ab" problem))
(variantc (format nil "~ac" problem)))
;;if the A and B variants exist, create a group file
;;(why not just check for a? I don't know, this just feels right)
(when (and (probe-file varianta)
(probe-file variantb))
...)))
Ошибка: 1, кишечник: 0.
По-видимому, тому, кто это написал, не пришло в голову, что, возможно, проверка всех трех вариантов была бы хорошей идеей. Конечно, это была ошибка, которую я отследил через десять лет после того, как этот код был первоначально написан (он предшествует первому журналу SVN).
Повторное употребление в пищу собачьей еды: у нас на работе есть такой же термин (разрешено, только потому, что я ввел его). Мой код изобилует комментариями с надписью «TODO» и указанием на то, что в конечном итоге должно быть сделано, но комментарий с надписью «DOGFOOD» (оба ключевых слова всегда в начале комментария, заглавными буквами) означает что-то, что необходимо сделать. до того, как эту программу можно будет использовать даже для внутреннего пользования. Это удобная вещь для поиска, так как слово "dogfood" никогда не появится в строке, заключенной в кавычки - если это произойдет, я всегда могу просто сказать "dog-food" или что-то в этом роде - так что даже поиск без учета регистра с правильными результатами.
Что касается обнуления аккумулятора: я проделал то же самое при программировании Intel 80x86 (я начал с 8086, а оттуда перешел на современные Pentium). Выполнение XOR регистра с самим собой - самый быстрый и надежный способ его очистить. Использование «MOV AX, 0» требует трех байтов (код операции и два байта буквального 16-битного нуля), тогда как «XOR AX, AX» - только два; это еще более заметно с расширенными регистрами 386 и выше, где «MOV EAX, 0» требует пяти байтов (четыре байта 32-битного нуля). Мой компилятор C / C ++ всегда обнуляет регистры таким образом, поэтому я предполагаю, что это по-прежнему лучший способ (хотя я давно не изучал таблицы времени кода операции, и, вероятно, оба регистра XOR, reg и MOV reg, imm принимают один такт) .
XOR EAX,EAX
: linux-kongress.org/2009 / слайды / (стр. 71).
- person Turbo J; 17.09.2010
Я делал базу данных в Access, очень простая вещь - по крайней мере, это должно было быть в начале, иначе я бы сделал это в Delphi. Клиент хотел получить информацию о клиенте из базы данных, но он не вводил достаточно информации, чтобы надежно идентифицировать клиента. Я сказал им использовать телефонный номер в качестве ключа, поскольку у каждого клиента (как они работают, а не для всех) будет свой номер. После нескольких безумных звонков от них (это не работает, мы не можем войти в клиента) я обнаружил, что они были слишком ленивы, чтобы искать телефонные номера в своей старой системе, и пытались ввести все номера, которые они не знали как "н / д". Пытаясь разобраться в этом для них, я закончил с множеством проверочных циклов в коде и получил комментарий рядом с одним результатом: «Этого никогда не должно быть достигнуто, если они делают то, что должны делать !!!!!!!! ! "
Однажды они также спросили меня: «Как мы можем найти правильного клиента, даже если мы указали неправильный адрес?» И все за копейки.
Оглядываться на старый код из классов весело ...
cardDeck.push_back(*(new card((rank)r, (suit)s))); // Push each card onto the deck
// Temp. objects are overrated
Проходя через некоторые вещи, мне хочется, чтобы я оставил больше комментариев в 4 часа утра, когда я взламывал случайный код ...
Я только что нашел это в каком-то устаревшем коде ..
'CANNOT JUST QUIT!
REM Don't delete this print statement ****** will die
Рассматриваемый процесс был службой в каком-то унаследованном коде
// Oh crap, i think i'm gonna yack
вскоре после этого последовали:
// TODO: end this lunacy
Я видел старый код фортрана:
integer *4 one,two,three;
c asssign one to 100 before entering the loop
one=100;
break; // it down
- person Benjamin Crouzier; 29.08.2011
#define if(x) if(!(x))
(или, что более зловещо, #define if while
)
- person Chris Lutz; 28.07.2010
a = TRUE;
преобразуется в a = FALSE // Happy debugging suckers;
, что приведет к ошибке компиляции, потому что термин ;
теперь находится в комментариях. Если вы используете комментарий блока /* Eat this */
, он будет работать.
- person rix0rrr; 17.09.2010
#define struct union
очень полезен в системах с ограниченным объемом памяти.
- person msw; 18.09.2010
False, True = True, False
Это для парня, который настаивает на использовании import *
в Python.
- person Herberth Amaral; 22.07.2011
return 2; // returns 1
- person Michael; 17.09.2010
#DEFINE 1 as something else
также был бы комментарием на этом языке ...
- person Felix Dombek; 23.08.2011
double d
.
- person Kevin; 24.11.2010
try
отключает компьютер.
- person Andrew Arnold; 14.03.2011
\
(используется для обозначения направления, в котором мы движемся в 2D-массиве) заставляет компилятор пропускать следующую строку.
- person Tgr; 31.05.2010
if(__LINE__ == 450)
- person Benoit; 07.04.2011
if (0 != (m_measures = --index))
.
- person Simon Buchan; 16.03.2009
Move ship card Captain?
?
- person Mateen Ulhaq; 23.09.2011
pCard
изображал Патрик Стюарт.
- person Jacob Krall; 25.09.2011
catch (SecurityException sEx)
.
- person Michael; 17.09.2010
volatile long time;
- person fastcodejava; 23.12.2010
(_xsNamespaces = new XmlSerializerNamespaces()).Add("", "")
;
- person Andrei Rînea; 24.04.2009