Inspiring your creativity...

Banner 468

Facebook
RSS

20 All Too Common Coding Pitfalls For Beginners

JavaScript Tips

1 - Unnecessary DOM Manipulation

The DOM is slow. Limiting your interaction with it will greatly increase your code’s performance. Consider the following (bad) code:
1
2
3
4
5
// anti-pattern
for (var i = 0; i < 100; i++){
   var li = $("<li>").html("This is list item #" + (i+1));
   $("#someUL").append(li);
}
This code actually modifies the DOM 100 times, and unnecessarily creates 100 jQuery objects. 100! A more correct approach would be to either use a document fragment, or build up a string that contains the 100 <li/> elements, and then appends that HTML to the containing element. That way, you jump into the DOM a total of once. Here’s an example:
1
2
3
4
5
var liststring = "";
for (var i = 100; i > 0; i--){
   liststring += "<li>This is list item #" + (99- i);
}
document.getElementById("someUL").innerHTML(liststring);
As noted above, with this technique, we touch the DOM only once, which is an improvement, but it also relies on string concatenation to build a large string. There’s a different way that we could approach this, using arrays.
1
2
3
4
5
6
7
var liststring = "<li>"
var lis = [];
for (var i = 100; i > 0; i--){
   lis.push("This is list item #" + (99- i));
}
liststring += lis.join("</li><li>") + "</li>";
document.getElementById("someUL").innerHTML(liststring);
When building large strings, storing each piece of the string as an item within an array element and calling join() is more efficient than string concatenation. This is one of the fastest and easiest ways to build repetitive HTML in JavaScript without using a template library or framework.

2 - Inconsistent Variable & Function Names in JavaScript

This next item isn’t a performance issue, but is extremely important – especially if you are working on code that other people work on, as well. Keep your identifiers (variable and function names) consistent. Consider the following variables as an example:
1
2
3
var foo = "bar";
var plant = "green";
var car = "red";
It wouldn’t make sense to add another variable, called Something. This introduces inconsistency in your variable naming pattern, causing your brain to cognitively flag this variable as being different or special. This is why constants in most languages are traditionally defined with all caps.
You can take this a step further by maintaining similar length, grammatical structure, and explanatory nature when naming functions. For example, consider the following contrived function:
1
2
3
function subtractFive(number){
   return number - 5;
}
Naming a function that adds five to a given number should follow the same pattern, shown here:
1
2
3
function addFive(number){
   return number + 5;
}
Sometimes, you might name a function to indicate its return value. For instance, you might name a function that returns an HTML string getTweetHTML(). You might also prepend a function’s name with do, if the function simply performs an operation and doesn’t return a value, eg: doFetchTweets().
Constructor functions typically follow the tradition of classes in other languages, capitalizing the first letter:
1
2
3
function Dog(color){
   this.color = color;
}
As a general rule of thumb, you should be descriptive when naming your identifiers. Classify them together with other similar identifiers by maintaining a naming pattern that is readable and offers hints to the nature of a variable or function’s purpose.

3 - Use hasOwnProperty() in for...in Loops

JavaScript’s arrays are not associative; trying to use them as such is frowned upon by the community. Objects, on the other hand, can be treated as hash tables, and you can iterate over an object’s properties by using the for...in loop, like so:
1
2
3
for (var prop in someObject) {
    alert(someObject[prop]); // alert's value of property
}
The problem, however, is that the for...in loop iterates over every enumerable property on the object’s prototype chain. This can be problematic if you only want to use the properties that exist on the actual object.
You can solve this issue by using the hasOwnProperty() method. Here’s an example:
1
2
3
4
5
for (var prop in someObject) {
    if (someObject.hasOwnProperty(prop)) {
        alert(someObject[prop]); // alert's value of property
    }
}
This version only alerts the values of the properties that directly reside on someObject.

4 - Comparing Boolean Values

Comparing boolean values in a condition is a waste of computation time. Take a look at the following for an example:
1
2
3
4
5
if (foo == true) {
    // do something for true
} else {
    // do something for false
}
Notice the condition: foo == true. The comparison of foo and true is unnecessary because foo is already a boolean value (or it’s a truthy or falsey one). Instead of comparing foo, simply use it as the condition, like this:
1
2
3
4
5
if (foo) {
    // do something for true
} else {
    // do something for false
}
To test for false, use the logical NOT operator, as shown below:
1
2
3
4
5
if (!foo) {
    // do something if foo is false
} else {
    // do something if foo is true
}

5 - Event Binding

Events are a complicated subject in JavaScript. Gone are the days of inline onclick event handlers (except in some very rare “splash page” cases). Instead, use event bubbling and delegation.
Let’s imagine that you have a grid of pictures that need to launch a modal lightbox window. Here’s what you shouldn’t do. Note: we’re using jQuery here, assuming you are using a similar library. If not, the same bubbling principles also apply to vanilla JavaScript.
The relevant HTML:
1
2
3
4
5
6
<div id="grid-container">
   <a href="someimage.jpg"><img src="someimage-thumb.jpg"></a>
   <a href="someimage.jpg"><img src="someimage-thumb.jpg"></a>
   <a href="someimage.jpg"><img src="someimage-thumb.jpg"></a>
   ...
</div>
The (bad) JavaScript:
1
2
3
$('a').on('click', function() {
   callLightbox(this);
});
This code assumes that calling the lightbox involves passing an anchor element that references the full size image. Instead of binding to each anchor element, bind to the #grid-container element instead.
1
2
3
$("#grid-container").on("click", "a", function(event) {
   callLightbox(event.target);
});
In this code, both this and event.target refer to the anchor element. You can use this same technique with any parent element. Just make sure to define the element that should be the event’s target.

6 - Avoid Ternary Redundancy

The overuse of ternary statements is quite common both in JavaScript and PHP.
1
2
// javascript
return foo.toString() !== "" ? true : false;
1
2
// php
return (something()) ? true : false;
A condition expression always returns a true or false value, meaning you don’t need to explicitly add true/false as ternary values. Instead, you could simply return the condition:
1
2
// javascript
return foo.toString() !== "";
1
2
// php
return something();

PHP Tips

7 - Use Ternary When Appropriate

if...else statements are a central part of most languages. But doing something simple, such as assigning a value to a variable based upon a condition – well, they can junk up your code. Consider the following code:
1
2
3
4
5
6
7
8
if ($greeting)
{
    $post->message = 'Hello';
}
else
{
    $post->message = 'Goodbye';
}
This code can be reduced to one line, while still maintaining readability by using the ternary operator, like this:
1
$post->message = $greeting ? 'Hello' : 'Goodbye';
It’s clear, concise, and gives you the functionality you need.
As useful as the ternary operator is, the most important guideline is not to over-use it! The goal of coding is not to cramp your logic into as few lines as possible.

8 - Throw Exceptions Instead of Inception-Style Nesting

Let’s face it: many levels of nesting is ugly and difficult to maintain/read. The following code is a relatively simplified example, but they get much worse over time:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// anti-pattern
$error_message = null;
if ($this->form_validation->run())
{
   if ($this->upload->do_upload())
   {
      $image = $this->upload->get_info();
      if ( ! $this->image->create_thumbnail($image['file_name'], 300, 150))
      {
         $error_message = 'There was an error creating the thumbnail.';
      }
   }
   else
   {
      $error_message = 'There was an error uploading the image.';
   }
}
else
{
   $error_message = $this->form_validation->error_string();
}
// Show error messages
if ($error_message !== null)
{
   $this->load->view('form', array(
      'error' => $error_message,
   ));
}
// Save the page
else
{
   $some_data['image'] = $image['file_name'];
   $this->some_model->save($some_data);
}
That’s some nasty code, but you can make it drastically cleaner by using exceptions, like so:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
try
{
   if ( ! $this->form_validation->run())
   {
      throw new Exception($this->form_validation->error_string());
   }
   if ( ! $this->upload->do_upload())
   {
      throw new Exception('There was an error uploading the image.');
   }
   $image = $this->upload->get_info();
   if ( ! $this->image->create_thumbnail($image['file_name'], 300, 150))
   {
      throw new Exception('There was an error creating the thumbnail.');
   }
}
// Show error messages
catch (Exception $e)
{
   $this->load->view('form', array(
      'error' => $e->getMessage(),
   ));
   // Stop method execution with return, or use exit
   return;
}
// Got this far, must not have any trouble
$some_data['image'] = $image['file_name'];
$this->some_model->save($some_data);
It might be the same number of lines, but it allows for considerably more readable and maintainable code. It also avoids those difficult debugging sessions, where you’ve missed a possible path through the if statement. Keep it simple!

9 - False-Happy Methods

Being exception-happy is far more advantageous than being false-happy.

Ruby or Python developers are used to watching for trivial exceptions. While that sound tedious, it’s actually quite a good thing. If anything goes wrong, an exception is thrown, and you instantly know where the problem is.
In PHP – and especially when using older frameworks, such as CodeIgniter – you get what I refer to as “false-happy code” (as opposed to exception-happy). Instead of having an exception get all up in your face, it just returns a false value and assigns the error string to some other property. This forces you to fish it out of the class using a get_error(); method.
Being exception-happy is far more advantageous than being false-happy. If an error occurs within your code (eg: could not connect to S3 to upload an image, or a value is empty, etc.), then throw an exception. You can also throw specific types of exceptions by extending the Exception class, like so:
1
class CustomException extends Exception {}
Throwing a custom exception makes debugging considerably easier.

Tip 10 - Use Guard Clauses

It’s common to use if statements to control a function or method’s execution path. It’s tempting to test a condition and execute a lot of code when the condition results in true, only to simply return in the else statement. For example:
1
2
3
4
5
6
7
8
function someFunction($param) {
    if ($param == 'OK') {
       $this->doSomething();
       return true;
    } else {
       return false;
    }
}
This kind of solution, however, represents a potential for spaghetti code. You can make this code easier to read by reversing the condition. Here’s the better version:
1
2
3
4
5
function someFunction($param) {
    if ($param != 'OK') return false;
    $this->doSomething();
    return true;
}
Isn’t that easier to read? It’s a simple change that makes a drastic difference in the readability of your code.

Tip 11 – Use while for Simple Iterations

The for loop is commonly used when you need, for example, a counter. Here’s a simple for loop:
1
2
3
for (var i = 0; i < x; i++) {
    ...
}
There are some very good reasons to use a for loop, but a while loop may be better if you just need something simple, like this:
1
2
3
4
var i = x;
while (i--) {
    ...
}
It doesn’t work in every situation, but it is an alternative.

Tip 12 – Keep Methods Maintainable

This is easily one of the most frequent mistakes made by newcomers.
A method is an object’s unit of work, and limiting your methods to a maintainable size makes your code easier to read and maintain. Take a look at the following monster method:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class SomeClass {
   function monsterMethod() {
      if($weArePilots) {
         $this->goAndDressUp();
         $this->washYourTeeth();
         $this->cleanYourWeapon();
         $this->takeYourHelmet();
         if($this->helmetDoesNotFit())
            $this->takeAHat();
         else
            $this->installHelmet();
         $this->chekcYourKnife();
         if($this->myAirplain() == "F22")
            $this->goToArmyAirport();
         else
            $this->goToCivilianAirport();
         $this->aim();
         $this->prepare();
         $this->fire();
      }
   }
}
Consider breaking this monster method into smaller, descriptive chunks, each being responsible for performing one well-abstracted action. This is easily one of the most frequent mistakes made by newcomers.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class SomeClass {
   function monsterMethod() {
      if($weArePilots) {
         $this->prepareYourself();
         $this->tryHelmet();
         $this->findYourAirport();
         $this->fightEnemy();
      }
   }
   private function prepareYourself() {
      $this->goAndDressUp();
      $this->washYourTeeth();
      $this->cleanYourWeapon();
      $this->chekcYourKnife();
   }
   private function tryHelmet() {
      $this->takeYourHelmet();
      if($this->helmetDoesNotFit())
         $this->takeAHat();
      else
         $this->installHelmet();
   }
   private function findYourAirport() {
      if($this->myAirplain() == "F22")
         $this->goToArmyAirport();
      else
         $this->goToCivilianAirport();
   }
   private function fightEnemy() {
      $this->aim();
      $this->prepare();
      $this->fire();
   }
}
There we go: cleaner, and easier to debug!

Step 13 - Avoid Deep Nesting

Too many levels of nesting makes code difficult to read and maintain. Consider the following:
1
2
3
4
5
6
7
8
9
10
function doSomething() {
    if ($someCondition) {
        if ($someOtherCondition) {
            if ($yetSomeOtherCondition) {
                doSomethingSpecial();
            }
            doSomethingElse();
        }
    }
}
You can refer to Tip #10 to make this code easier to read by reversing some of the conditions.
1
2
3
4
5
6
7
8
9
10
11
12
function doSomething() {
    if (!$someCondition) {
        return false;
    }
    if (!$someOtherCondition) {
        return false;
    }
    if ($yetSomeOtherCondition) {
        doSomethingSpecial();
    }
    doSomethingElse();
}
This code is considerably cleaner and produces the same results as before.
When you find yourself with nested if statements, closely examine your code; your method may be performing more than one task. Here’s an example:
1
2
3
4
5
6
7
function someFunc() {
   if($oneThing) {
      $this->doSomething();
      if($anotherThing)
         $this->doSomethingElse();
   }
}
In these cases, extract the nested methods into their own method:
1
2
3
4
5
6
7
8
9
10
function someFunc() {
   if($oneThing) {
      $this->doSomething();
      $this->doAnotherThing($anotherThing);
   }
}
private doAnotherThing($anotherThing) {
   if($anotherThing)
      $this->doSomethingElse();
}

Tip 14 – Avoid Magic Numbers and Strings

Magic numbers and strings are evil. Define variables or constants with the values you want to use in your code.
Instead of this:
1
2
3
4
5
function someFunct() {
   $this->order->set(23);
   $this->order->addProduct('superComputer');
   $this->shoppingList->add('superComputer');
}
Specify what those numbers and strings mean, and assign them to a variable with a meaningful name, like this:
1
2
3
4
5
6
7
function someFunct() {
   $orderId = 23;
   $selectedProductName = 'superComputer';
   $this->order->set($orderId);
   $this->order->addProduct($selectedProductName);
   $this->shoppingList->add($selectedProductName);
}
While some might argue that we’re needlessly creating variables, the performance hit is negligible. Readability always takes priority. Remember: don’t optimize for performance until you can describe why it’s necessary.

Step 15 - Use Built-In Array Functions

Use the built-in array functions instead of foreach().
Not Ideal:
1
2
3
foreach (&$myArray as $key =>$element) {
   if ($element > 5) unset ($myArray[$key]);
}
Better:
1
$myArray = array_filter($myArray, function ($element) { return $element <= 5;});
PHP offers a variety of array methods. They’re confusing at first, but take a day and try to learn as many as possible.

Tip 16 - Don’t Overuse Variables

It’s easy to overuse variables, but remember that variables are stored in memory. For every variable you create, the system needs to allocate memory for that variable. Look at this code:
1
2
3
4
5
public function get_posts() {
   $query = $this->db->get('posts');
   $result = $query->result();
   return $result;
}
The $result variable isn’t necessary. The following code omits that variable:
1
2
3
4
public function get_posts() {
   $query = $this->db->get('posts');
   return $query->result();
}
The difference is subtle, but we were able to improve this simple example. We kept the $query variable because it relates to the database, while $result related more to our logic.

General Programming Recommendations

Tip 17 - Rely on the Database Engine

Anything less is a code smell.
A database is designed for working with data; use its tools and abilities to make your application more efficient.
For example, you can avoid redundant database queries in many circumstances. Most plug-and-play user management scripts use two queries for user registration: one to check whether the e-mail/username already exists and another to actually add it to the database. A much better approach is to set the username field to UNIQUE. You can then use native MySQL functions to check whether or not the record was added to the database.

Tip 18: Properly Name Your Variables

The days of naming your variables x, y, z are over (unless, of course, you’re dealing with a coordinate system). A variable represents an important part of your logic. Don’t want to type a long name? Get a better IDE. Modern IDEs auto-complete variable names in a blink of an eye.
Always be coding for six months from now. Are you certain that you’ll remember what that $sut variables refers to a year from now? Likely not: be descriptive. Anything less is a code smell.

Tip 19 - Methods Represent Actions

Mistakes happen; the key is to learn from them.
Name your methods with verbs representing the action they perform. The main concept is the exact opposite of the variable naming scheme. Use a short, but descriptive, name in a large scope (ie: public methods), and use a longer and more detailed name in a short scope (ie: private / protected methods). This helps make your code read like well written prose.
Also avoid any language other than English, when naming your methods. It’s annoying to read function names like 做些什麼() or делатьчтото() in your project. It may be impossible for other programmers to understand your intent. While it might seem arrogant, for better or worse, English is the adopted language of code. Try to use it, if we’re working on a large team.

Tip 20: Structure Recommendations

Finally, code structure is just as important to readability and maintainability as anything else we’ve talked about today. Here are two recommendations:
  • Indent with four or two space-width tabs. Anything more, such as eight spaces, is too much and will make your code difficult to read.
  • Set a reasonable line-width and respect it. Forty characters in a line? We’re not in the ’70s any more; set your limit to 120 characters, put a mark on the screen, and force yourself or your IDE to respect that limit. 120 characters gives you a nice width without making you scroll.

Conclusion

“I’ve never made a stupid programming mistake.” — No one, ever.
Mistakes happen; the key is to learn from them. We at Nettuts+ have made, and will continue to make, mistakes. Our hope is that you learn from our mistakes so that you can avoid them in the future. But, to be honest, the best way to learn best practices is to make the mistakes yourself!
Thanks for reading!

[ Read More ]

10 Tips for Writing for Designers

screenshot

Ever get that feeling that some members of your creative team just aren’t quite with the program? It is entirely likely. Sending out communications and messages that will reach your whole team can be somewhat tricky because of the differences in how people think.

Creatives sometimes tend to be a little more free-thinking and less-structured than some of their office counterparts. Research has shown that people who use more right brain functions, such as designers and creative thinkers, also respond to and process the same information differently than left-brain thinkers, who tend to be more organized and logic-oriented. (Some studies have even shown that the highest rates of dyslexia, which affects reading and comprehension, have been found in right-brain thinkers.) With just a few tweaks, you can more effectively get your message across to everyone.

1. Stay on Topic

Send out communications with a purpose. Determine what your message is and stick to it. Long memos or emails can be overwhelming to read when time is a concern or deadlines are approaching. Put together your message and set it aside for a while before hitting the “send” button. Come back and reread it. Edit closely. Get rid of all the extra information and keep the message on point (even if you save some information for a future memo).

2. Messages Should Have Hierarchy

Big words do seem more important. Use headlines and big words to stress important information. Structure emails and memos with two to three different font sizes to stress important points and make for easier reading. Use the largest size for the most important information and use more standard sizing for the body of the message. Be careful not to “over-design” your message. Going crazy with fonts and colors will only cause distractions.

3. Show, Rather than Tell

Provide examples of what you like and what you are looking for when detailing projects to the design group. Communication is about more than words; remember that when working with your visual thinkers. Show the idea. Send out links or attach images that help convey your message. Use visual examples in your writing to describe what you are looking for. Remind the designer of a project that you liked and how this project might use a similar (or vastly different) approach.

4. Keep it Short

screenshot

Bullet points are one of the most effective ways to cover a lot of information in a digestible format. Don’t feel the need to write a manifesto; highlight necessary information and encourage feedback. Edit, edit, edit. If you can say it in 10 words, don’t use 30. Keep sentences short and to the point. Delivering too many messages at once can keep your point from being understood.

5. Watch the Jargon

In every business, there is a set of lingo that comes with the territory. But does the business lingo translate to the creative team? Avoid uncommon phrasing or too much inside talk when discussing projects or ideas. Remember members of your creative team may not have a background in your specific industry. Using common language and descriptions will help keep everyone communicating on the same page.

Business catch words such as “strategize,” “utilization” and “expedite” might work better as “plan,” “use” and “speed up.” Stay away from emoticons and casual phrasing as well. “OMG” or “LOL” in an email is likely to cause a serious round of eye rolls from the group and can take away from the seriousness of almost any message.

6. Don’t Assume Anything and Explain Specifics

Never guess that someone knows what you are talking about. When outlining or explaining new information make sure the designer has a clear idea of where you are coming from. In contract or freelance situations, explain a bit about your company, goals and market. Set a clear outline of what the project and design is supposed to accomplish. Even if a designer has done a similar project in the past, provide an overview of the client or project.

In most projects, there are some absolutes. Color and typography selections are sometimes items that can’t be changed when looking at design projects. Make sure specifics are clearly communicated. If your company’s logo is blue, for example, state the color values. You will not end up with an odd color and project rework when non-negotiables are determined in advance. In addition to being specific, be accurate and aware of grammar and context. It can only add to your credibility.

7. Write with Action

Use active words in your message. Start sentences words that engage. Consider structuring a what’s next memo as a to-do list. Tell rather than ask when it comes to things that need to get gone. Rather than “can you make that logo blue to match the company’s website?” say “Add blue to the logo so it is more on target with the design.”

8. Take a Walk

Sometimes the best written communications also need a push. Get up and pay your designer a visit and take the memo with you. Go over information together and make sure that all the details are clear. Brainstorm for a few minutes to show that you are interested in what the designer has to say. Afterward, make sure to follow up with any new instructions or changes from the initial message.

9. All Designers are Different

screenshot

A print ad campaign by Mercedes-Benz exemplified differences in thinking by showcasing the differences in left- and right-brain thinkers. Keep this principle in mind as you write and remember designers tend to employ that loose, colorful, free-flowing style of comprehension and thinking.

Understand that your message can come across in a variety of ways. Keep the agenda simple and context plain and clear. Don’t try to make jokes or be funny in text; they might not cause your recipient to giggle. Just because designers may communicate in a way that is unlike accountants, don’t dumb things down. Don’t assume that because you are writing for a designer, that he or she won’t “get it;” plenty of designers are also good writers.

10. Break the Rules on Purpose

Sometimes it is OK to start a sentence with “And.” And sometimes it is an effective writing device. Breaking some of the stodgy rules of communication can make your message feel a little less like a list of directives and more like a written conversation. Every memo or email does not have to follow the business-letter model; sometimes a more casual approach is appreciated. If your message feels too formal, back up for a minute and rewrite: Write as you talk.

Conclusion

Clear communication is key when working with any different number of people, but understanding how the thought processes of designers can differ can help you deliver a clearer message. Remember that many designers and creative personality types think using a different side of the brain than more analytical thinkers and may receive written communications differently.

Work to establish a clear hierarchy in your message and think about ways to more visually deliver information. Keep messages on task and edited so that information is direct and concise. Finally, make sure to always follow up any written communication with a conversation; direct contact can always go a long way

[ Read More ]