• (cs)

    LMAO!!! Better that having table names like DC00100,PS40200, IV10010 and columns like PSPCX, IVDCX (WTF is is that)... more even when it's you first day at a new job and you have to do views for a client and the deadline is tomorrow on.

  • (cs) in reply to Sam
    Sam:
    daniel c w:
    I do not think it is a F. Fail to see what's so bad about it. I would actually write that kind of code
    peopleIWouldPreferNeverToWorkWithBecauseTheyDoNotKnowHowToCode.add(new ProgrammerWhoDoesNotKnowHowToNameProgrammingElements("daniel c w"))

    actually you just showed how descriptive "long" names can be, didn't you ?

  • (cs) in reply to Beau "Porpus" Wilkinson
    Beau "Porpus" Wilkinson:
    People who do this suffer from a misunderstanding. They think it's possible to come up with a variable name in English that perfectly describes its role. It's not possible... that's not what natural language is for.

    why isn't it possible ?

  • Jens (unregistered) in reply to Welbog
    Welbog:
    Me:
    Welbog:
    Jens:
    oh ok, I just realised that it was the classname and the variablename that differ in first letter.. still not a bright thing to do..
    This is a pretty common convention, from my point of view. How do you name single instances of classes?
    ClassName: Car

    Singleton: aCar

    That's a reasonable convention, but the difference between the class name and the instance name is still only one letter. Unless your ability to read case-sensitive code has been ruined by reading forums whose members don't capitalize or by case-insensitive programming languages (a WTF by itself), I don't really understand what the problem is with Car car = new Car();

    Well, i a sense you describe the problem yourself. A language must help the programmer by being as strict as possible.. (you say its a WTF that some languages are case-insensitive, so you must agree..) As its only CONVENTION that class'es start with capital letters and instances with lowercase letters, I could easily have car Car in stead of Car car. (I agree, its stupid), but as we have seen, say a couple of thousand times on. say worsethanfailure.com, we already know that many many and many more, programmers out there, are a bit careless when it comes to following convention... Therefore, I vote for case-insensitive languages, to avoid this... well, just my two bits (Bit aBit)

  • Jens (unregistered) in reply to Aaron
    Aaron:
    There are only two authoritative C# coding standards that I'm aware of, Microsoft's and Philips'. They both specify that for variables representing a generic instance of a class with unknown purpose, the correct name for the variable is the lowercase version of the class name.

    Not "aThing". Not "theThing". Not "someThing". Not "myThing". Not "_thing". Not "iCanHasThing". Just "thing".

    Furthermore, it's perfectly acceptable to declare a public property name identical to its type name. The .NET system classes do this frequently, for example, DateTime.DayOfWeek. This makes sense because, well, it makes sense. A date occurs on some day of the week, and a day of the week is... a day of the week.

    There's absolutely nothing wrong with having a class named SecurityContext, and in another class, having a private field named securityContext, a public property named SecurityContext, and a constructor with argument SecurityContext securityContext. What else would you call the ctor argument - securityContextForThisInstanceButMaybeNotExclusively? Maybe securityContextThatHappensToBeUsedHere? Or perhaps securityContextUsedToInitializeAPrivateField"?

    Silly prefixed versions like _securityContext or mySecurityContext add absolutely no new information and are therefore just useless cruft. The fact is, we have a class whose name specifies its purpose intrinsically; we don't need any more identifying information! It's not like an int, which could either be a record count or the current room temperature; it's a SecurityContext, which is... um... the security context. Duh?

    Yes, this is illegal in VB. That's why VB and C# and every other language on the planet all have different coding conventions. But seriously folks, don't go around telling people how to code in their language based on conventions from your preferred language.

    Capiche?

    Yeah, I capiche your thoughts.. But seriously.. dont go around telling folks what THEY have to consider to be WTF's.. Just because Microsoft and Phillips say so, does that make it "the only and most correct way".. Nah... just look at the OS Windows... Thats a WTF on its own, even if they had Car car instead of Car aCar.. And what the Hecks wrong with My prefix, as in MySQL, MyBook, My Computer, My lotsastuff

  • Watson (unregistered) in reply to daniel c w
    daniel c w:
    Beau "Porpus" Wilkinson:
    People who do this suffer from a misunderstanding. They think it's possible to come up with a variable name in English that perfectly describes its role. It's not possible... that's not what natural language is for.

    why isn't it possible ?

    I think the proof would take the form of a reductio ad absurdum, and be based on the following observation: If it were to be possible, we'd already be doing so - and we wouldn't need all this nasty nasty computer language stuff.

    '—I proceed. "Edwin and Morcar, the earls of Mercia and Northumbria, declared for him: and even Stigand, the patriotic archbishop of Canterbury, found it advisable—"'

    'Found what? said the Duck.

    'Found it,' the Mouse replied rather crossly: 'of course you know what "it" means.'

    'I know what "it" means well enough, when I find a thing,' said the Duck: 'it's generally a frog or a worm. The question is, what did the archbishop find?'

  • James (unregistered) in reply to Zygo
    Zygo:
    Of the two I prefer 'aCar' (although for a singleton I'd use 'theCar') since (assuming rigorous following of coding standards) a global search for "Car" will find all the class references and the instances too (along with a pile of false positives of course).

    The trouble with 'car' is that it's spelled differently from 'Car'.

    I'd prefer using: Car car = new Car(); just seems nicer to me or rather, ICar car = new Ford();

    Anyway what I really wanted to say was in C# there is no reason to identify the variable as a singleton. As you would use it the same way. So I'd call the singleton car too.

    ICar car = Ford.Instance();

  • Rhialto (unregistered) in reply to seymore15074
    seymore15074:
    wtf:
    With intellisense its not that bad.

    not really a big deal

    I use vi. I would fall short of being very happy about it.

    Try vim. It has word completion.

  • Anonymous Philips Hater (unregistered) in reply to Jens
    Jens:
    Aaron:
    There are only two authoritative C# coding standards that I'm aware of, Microsoft's and Philips'.

    Yeah, I capiche your thoughts.. But seriously.. dont go around telling folks what THEY have to consider to be WTF's.. Just because Microsoft and Phillips say so, does that make it "the only and most correct way".. Nah... just look at the OS Windows... Thats a WTF on its own, even if they had Car car instead of Car aCar.. And what the Hecks wrong with My prefix, as in MySQL, MyBook, My Computer, My lotsastuff

    Just to add my 2 (Euro) Cents - anything recommended/designed by Philips is most likely a WTF in itself - as anyone who has ever used their microcontrollers knows.

  • (cs) in reply to K_Logic
    K_Logic:
    LMAO!!! Better that having table names like DC00100,PS40200, IV10010 and columns like PSPCX, IVDCX (WTF is is that)... more even when it's you first day at a new job and you have to do views for a client and the deadline is tomorrow on.

    Argh! AS/400 flashback!

  • (cs) in reply to ArashiNK
    ArashiNK:
    ... in a programming class.

    Were you programming a class in programming class?

    (Sorry. Couldn't resist.)

  • (cs) in reply to vt_mruhlin
    vt_mruhlin:
    I will rue the day that a widely used programming language allows spaces within identifiers.
        RUE THAT DAY = 1
        IF (RUETHATDAY .EQ. 1) THEN
                WRITE (6,*) 'Ha ha ha'
        ENDIF
        END
    
  • AdT (unregistered)
    Jake Vinson:
    calling functions like GetRidiculouslyLongClassNameThatsPracticallyImpossibleToReadById

    Where Id is a 200 digit GRUID (Globally Really Unique Identifier).

  • AdT (unregistered) in reply to chuck
    chuck:
    What is a country manufacturer doing messing with drug strengths anyway? They should be sticking with what they know: manufacturing countries.

    And the official term is not "country manufacturing", it's "nation building".

  • (cs) in reply to whicker
    whicker:
    Wasn't the Apple II limited to seeing the first 2 characters in the variable names, such that BLACK and BLUE were considered to be the same?
    Don't knock it.

    Remember that the BASIC interpreters back then were smaller than a typical 'Hello world' program nowadays...

  • Azd (unregistered)

    When I was a student on a placement year, I worked with a guy who was supposed to be an expert in effecient algorithms. (And actually he really did know his stuff) I was given a signal processing algorithm he had written in C (no documentation at all) that needed to be re-worked to work on a vector processor.

    Because he was soo concerned with effeciency his code would never calculate the same value more than once, it would calculate the value the first time it needed it and store it in a variable. His naming convention for the variables was:

    mp1 = m+1; mp2 = m+2; mm1 = m-1; md2 = m/2;

    Despite making the code difficult to read, it worked fine until it came to multiplication. Can you guess what letter he used for multiplication?

    When I asked him how I could tell the difference between minus and multiplied, he said you could infer it. mm2 is unlikely to be m-2 and much more likely to be m*2.

    That was a long year.

  • (cs) in reply to Aaron
    Aaron:
    But seriously folks, don't go around telling people how to code in their language based on conventions from your preferred language.

    Capiche?

    Ummm... A little too much coffee today? You might want to cut back a little.

    How is it better for you to be telling people what to think than it is for someone to tell you how to code?

  • (cs) in reply to Aaron

    Use namespaces, that's what they're for. Well, if that fail code is in C++, that is.

    It's like this irritating habit that some companies have to prefix the source file names instead of using sub directories. It's just a makeshift, unpractical and pointless categorization system used where one (directories) already exists.

    The guys who argue that with autocompletion (and not intellisense, learn to distinguish descriptive names from marketing ones people) it's not an issue are wrong: it still doesn't make the code readable. Unreadable code == unmaintanable code.

    Aaron:
    But seriously folks, don't go around telling people how to code in their language based on conventions from your preferred language.

    Capiche?

    The fact that people persist in using crappy programming languages is another issue entirely.

  • Anonymous (unregistered)

    Posting IntelliSense as a solution is a better WTF imho (one of the best WTFs so far).

    The "naming" is unfortunately like a feeling which cannot easily become a common concern in a common way for all.
    I periodically review the code of my developpers with themselves and even though they always agree on my critics (especially on naming) they can still do some minor mistakes if they feel a bit stressed or if they have to do something quickly (which i consider normal/human), but never in that way which is a very critical design issue and kind of insult to potential successors or current colleagues.

    If you code in that way you better stop coding. The fact that somebody stops you before you decide it looks like a better option.

    PS: Every programmer needs "The Practice of Programming".

  • (cs) in reply to S
    S:
    As someone who actually worked on the system in question, I can perhaps clarify somethings.
    1. The code is actually C#, not Java. camelCasing is perfectly supported in C#, even if it does or does not fall within the Microsoft recommended best practices.

    2. The code was produced within an agile shop, so any individual may touch the code in question. Long names allowed us to encode the desired functionality without the need for comments. The code was almost comment free, which means no stale comments littered over the place.

    3. It took us about 1 iteration to break in a new developer. That means that in less than 2 weeks, we could bring on a new developer and basically have them turning out production quality code with a minimum of baby sitting (We didn't practice that much pairing. ) I have never seen a project where that was the case.

    4. I haven't worked on the project in over 6 months, but I can

      a) Identify the code as code from the project, 'cause it all looked the same, which is a good thing. In a few cases, when we wrote duplicate cards, we had instances, where there were almost zero differences between the code 2 individual wrote, since our variable naming was very well thought out.

      b) Know what the code is trying to do, based admittedly with knowledge of the problem domain, but generally assisted by the name. I could walk in, sit down, and debug the code with little guidance, right now.DrugStrengthFactory doesn't work, because it isn't a drug strength factory, it is a factory to solve a very specific problem.

    c) SecurityContext securityContext makes as much sense as SecurityContext contextForHandlingSecurity or SecurityContext objSecurityContext.

    1. Naming an iterator idx is as meaningless as i, or even currentIndex. i works quite well when doing iteration. You know it is the iterator, don't you?

    You forgot one:

    1. The architect of this system was a hippie remnant of the '60s and '70s who dropped waaay too much acid, and his flashbacks seemed to coincide with the times he was developing new classes.
  • Tei (unregistered)

    IfIsHardToTypeSouldBeHardToRead

    YouHaveEIntellisenseToWriteItMaybeButYouDontHaveIntellisenseToReadIt,SoIsYourCodeReadOnly?

  • (cs) in reply to vt_mruhlin
    vt_mruhlin:
    I will rue the day that a widely used programming language allows spaces within identifiers. Yes, that day will be rued, but I feear code like this will convince somebody that it's a good idea.

    / Much rueing on that day.

    select [Day of Ruing], [Rue Quantity] from [Days to be Rued]

    Egad, how rued.

  • (cs) in reply to K_Logic
    K_Logic:
    LMAO!!! Better that having table names like DC00100,PS40200, IV10010 and columns like PSPCX, IVDCX (WTF is is that)... more even when it's you first day at a new job and you have to do views for a client and the deadline is tomorrow on.

    Wow! Bad memories from that one.

    I inherited an inventory/order entry system at an old job that had great table names like those above. BD011A was the job file, BD074A was the bill of lading header file, BD074B was the bill of lading detail file, etc. (Scary that I still remember that stuff.) I should have run away when I saw the names, but I was young and stupid at the time.

  • alexgieg (unregistered) in reply to Watson
    Watson:
    '—I proceed. "Edwin and Morcar, the earls of Mercia and Northumbria, declared for him: and even Stigand, the patriotic archbishop of Canterbury, found it advisable—"'

    'Found what? said the Duck.

    'Found it,' the Mouse replied rather crossly: 'of course you know what "it" means.'

    'I know what "it" means well enough, when I find a thing,' said the Duck: 'it's generally a frog or a worm. The question is, what did the archbishop find?'

    As Shakespeare would put:

    Speak your mind. Speak THY mind! SPEAK YOUR MIND!!!

  • (cs) in reply to KenW
    KenW:
    6. The architect of this system was a hippie remnant of the '60s and '70s who dropped waaay too much acid, and his flashbacks seemed to coincide with the times he was developing new classes.
    I don't think so. If that was the case, his identifiers would have been more on the line of:

    CorporationTeeShirtStupidBloodyTuesdayManYouBeenANaughtyBoyYouLetYourFaceGrowLong

  • (cs)

    isn't there a limit on the length of names, like 64 or 128 chars?

  • Someone (unregistered) in reply to Me
    Me:

    ClassName: Car

    Singleton: aCar

    Shouldn't that be theCar?

  • Zygo (unregistered) in reply to pscs
    pscs:
    whicker:
    Wasn't the Apple II limited to seeing the first 2 characters in the variable names, such that BLACK and BLUE were considered to be the same?
    Don't knock it.

    Remember that the BASIC interpreters back then were smaller than a typical 'Hello world' program nowadays...

    The stripped shared binary for "Hello, World!" on i386 is 7.8 times larger than the first machine I programmed BASIC on.

  • (cs) in reply to Jens
    Aaron:
    There are only two authoritative C# coding standards that I'm aware of, Microsoft's and Philips'. They both specify that for variables representing a generic instance of a class with unknown purpose, the correct name for the variable is the lowercase version of the class name. <snip pointless crap/>
    Authoritative? Or possibly: coding standards?

    WTF are you on?

    Coding standards, and I am happy with a minimalist sub-set of these, are entirely orthogonal to coding.

    Choosing your coding standard on the basis that a huge company such as Microsoft or Phillips dictates it to you is tantamount to admitting that you are a worm.

    Such a choice also detracts from looking at the lunacy in the OP and going:

    What the fuck?

    Any chance of ignoring externalities, writing and documenting and testing something that works, and ignoring cretinous directives from above?

    No, I thought not.

  • Beau "Porpus" Wilkinson (unregistered) in reply to JOHN
    JOHN:
    Uh... MS doesn't encourage anything this retarded. Grow some brains.

    OH REALLY? Check out "Practical Guidelines and Best Practices For Microsoft VB and C# Developers" (c) 2005 Microsoft Press:

    "Private fields and variable names have no limitation in length... Use meaningful names for fields and variables... Don't use abbreviations that would make the name ambiguous" (p 115)

    "Use PascalCase for both public and private methods... avoid underscores, and names longer than 25 characters if the method is public."

    It seems to me like this WTF is EXACTLY the kind of thing MS encourages in that book. As far as length goes, they encourage you to go nuts for private stuff, and to exercise just a bit more restraint (25 characters!) for public stuff. They are still caught up on words like meaningful and unambiguous. They are convinced CamelCase and pascalCase are better than those primitive old underscores.

    You can say that this WTF is an extreme example, but it reflects the Microsoft mentality about identifier naming: make sure your identifier names communicate everything (wink, wink) about their purpose, even if the result if obnoxious looking.

    And variable names can become stale just like comments... naming a variable counterForNextTenIterativeLoops is just as brittle as naming it "i" and commenting it as the "counter for the next ten iterative loops." The minute you add an eleventh loop, the name becomes wrong.

  • (cs) in reply to Me
    Me:
    seymore15074:
    wtf:
    With intellisense its not that bad.

    not really a big deal

    I use vi. I would fall short of being very happy about it.

    Use a real text editor. I am sure there is an intellisense-like minor mode for Emacs.
    And who cares, either way?

    We all know people who insist on using vi (or vim). They're rooted in the past, but they're happy.

    We all know people who use emacs (you, me, etc), and put up with the need to reconfigure the .emacs or .xemacs file on every job because the default doesn't recognise the concept of "mouse up" and "mouse down," and the sysadmin in charge of .profile uses vi/vim.

    We all know people who swear by their inadequate, degenerate and unreliable IDE because it offers colour-coding, auto-completion, and all manner of exquisite promises before it dies the death and takes your last two hours' work with it.

    Each to his own, I say. I prefer emacs because it's conceptually simple, rock-solid, never lies to me, and has never (short of reading in a file that's bigger than the amount of RAM available) crashed on me.

    The results are what matters, not the editor. I think there's a point here: if you really rely on Intellisense to parse an arbitrary CamelCase identifier with around ten or twelve nouns, verbs, adjectives, conjunctives, and have-not, then (a) you're not a programmer and (b) you're an idiot, because Intellisense just won't.

  • Nitrous (unregistered)

    150+ character variable names. The words have been substituted to remove "intellectual" property.

    http://phpabominations.com/archives/4

  • (cs) in reply to pitchingchris
    pitchingchris:
    Brady Kelly:
    wtf:
    With intellisense its not that bad.

    not really a big deal

    IWasAboutToSayThatButYouBeatMeToItByAVerySmallMargin.

    The goggles! They do nothing !

    Are you a real person? Or just a script that automatically posts a cliched response on the daily WTF every day?

  • (cs) in reply to Welbog
    Welbog:
    Jens:
    oh ok, I just realised that it was the classname and the variablename that differ in first letter.. still not a bright thing to do..
    This is a pretty common convention, from my point of view. How do you name single instances of classes?

    Singletons: I usually name with "the", as in "theSecurityContext".

    For parameters to a function where there's only one object of that kind, I used to use "a" as in "aSecurityContext" but I find that just using "securityContext" is usually more obvious.

  • chuck (unregistered) in reply to Cthulhu reencoded
    Cthulhu reencoded:
    RUE THAT DAY = 1 IF (RUETHATDAY .EQ. 1) THEN WRITE (6,*) 'Ha ha ha' ENDIF END

    LAWD is dat sum LOLTRAN?

  • Peter Y (unregistered) in reply to Jens
    Jens:
    And the variable names he passed are cool too:

    SecurityContext and securityContext differ only in the capitalisation of first letter..

    Brilliant !!!

    I once had to look over some code that had the following variable names. 'a', 'aa', 'aaa', 'aaaa'. Then, 'aaaA', 'aaAa' and so forth. Having gotten tired of 'a's he then went on to 't', 'tt' etc. This was in production code. On another project I had to look over VB code where to make variables independent he would mispell the name of the variable he was using before so 'thisVar' would become say 'thesVar'. Excellent.

    Peter

    captcha: doom ... well the project was I guess.

  • :E (unregistered)

    Oh god, this is exactly the way a program I use for work is coded, luckily I just need to use it, not rewrite it. The real WTF is that the programmer who wrote that program also has a textbook for VB programming published which tells you to write code exactly like that.

    Ewww indeed :/

  • Dascandy (unregistered) in reply to I think I might be Anonymous

    I and other people have tried getting the developers responsible to change it

    You sent Microsoft an email saying that "limited-length strings are a thing of the distant past - please upgrade your base libraries and filesystems accordingly" ?

  • Jeff L. (unregistered) in reply to Anonymous
    Anonymous:
    PS: Every programmer needs "The Practice of Programming".

    Most developers definitely need to learn how to clean up their code's act. But how about something a bit closer to being relevant for coding done in this millenium? Code Complete edition 2 is ok, but even it is still mired in the 80s half of the time. "200 line long functions" are ok, my ass.

  • Jeff L. (unregistered) in reply to Beau "Porpus" Wilkinson
    Beau "Porpus" Wilkinson:
    And variable names can become stale just like comments...

    Yes, and with the distinction that many developers will try to correct a screwed-up variable name, whereas they are highly unlikely to fix a comment.

  • (cs) in reply to TheRider
    TheRider:
    For these, therefore, my main motivation for naming is to make them unique as in: make them searchable with the usual Ctrl+F search tool. Therefore: NEVER EVER use one-letter or even two-letter variable names. I usually name loop variables "idx", "jdx" or "rowIndex", "colIndex". That makes them decently searchable, or search-and-replaceable, if you want.

    I'll admit, I'm guilty of using single letters for loops... a strong holdover from the old days of programming where most loop letters were throw-away variables anyway. But what you say here makes perfect sense. You never know when you might need to do a search on those names and single letter variables means you're going to get far too many hits.

    I will definitely be working in three letter variable names for my looping and indexing and throw-away variables for clarity and searching sake! :)

    (You really can learn stuff off WTF!)

    -- Seejay

  • (cs) in reply to Jeff L.
    Jeff L.:
    seymore15074:
    wtf:
    With intellisense its not that bad.

    not really a big deal

    I use vi. I would fall short of being very happy about it.

    Dictionary completions with ctrl-n work just fine for me in vim.

    -j-

    Thank you, I did not know this. :D

  • Eryn (unregistered) in reply to Aaron

    well said, wouldn't have minded seeing the rest of the code, SecurityContext is new to the framework and used to tell threads what permissions they have. this programmer isn't half bad if he's using SecurityContext.

  • (cs) in reply to Jeff L.
    Jeff L.:
    Beau "Porpus" Wilkinson:
    And variable names can become stale just like comments...
    Yes, and with the distinction that many developers will try to correct a screwed-up variable name, whereas they are highly unlikely to fix a comment.
    Got evidence for that, matey?

    If you're incompetent enough not to fix the comment, it's unlikely that you're competent enough to fix the name of the function.

  • (cs) in reply to seejay
    seejay:
    TheRider:
    For these, therefore, my main motivation for naming is to make them unique as in: make them searchable with the usual Ctrl+F search tool. Therefore: NEVER EVER use one-letter or even two-letter variable names. I usually name loop variables "idx", "jdx" or "rowIndex", "colIndex". That makes them decently searchable, or search-and-replaceable, if you want.

    I'll admit, I'm guilty of using single letters for loops... a strong holdover from the old days of programming where most loop letters were throw-away variables anyway. But what you say here makes perfect sense. You never know when you might need to do a search on those names and single letter variables means you're going to get far too many hits.

    I will definitely be working in three letter variable names for my looping and indexing and throw-away variables for clarity and searching sake! :)

    (You really can learn stuff off WTF!)

    -- Seejay

    Why?

    Loops are fine as "i" and iterators are fine as "it(n)".

    Should you need to use either an external tool like grep (my saviour) or an internal tool like Intellisense, neither one will matter. If they did, we'd be back in the bad old days of Fortran or BCPL. These are local variables.

    Outside the (preferably 30 lines or so) member function, they have no meaning at all.

  • anonymous (unregistered)

    uuh, that's gonna consume some hard disk space, too :D

  • SurferJoe (unregistered)

    Who posted my code?

  • Ron Chmara (unregistered) in reply to vt_mruhlin
    <?php $name = 'I will rue the day that a widely used programming language allows spaces within identifiers. Yes, that day will be rued, but I feear code like this will convince somebody that it\'s a good idea. '; $$name = TRUE; //ow. print_r(get_defined_vars()); ?>
  • (cs)

    I actually heartily AGREE with this method of naming variables.

    The problem you can come into, though, is that the role of a variable can subtly change (particularly if you are doing RAD), which then renders the name confusing.

    The trick is to be descriptive but not toooo specific, which is a juggling act.

    But give me long variable names over short ones any day (so long as you either stick to using_lowercase_with_underscores or CapitalisingWordBoundaries or capitalisingLateWordBoundaries. If you Use_A_Mixture_of_the_Two I will frigging GET YOU). ;)

  • Daniel Colascione (unregistered) in reply to TheRider

    Why not just search for "\bi\b" or somesuch then, at least in the limited scope that a throwaway variable ought to have? We're not using EDIT.COM here.

Leave a comment on “Really Descriptive Names”

Log In or post as a guest

Replying to comment #:

« Return to Article