Хороший разработчик всегда пытается максимально упростить код. Но тех, кто не ищет легких путей, гораздо больше. Посмотрите, насколько сильно люди усложняют элементарные задачи.
Задача разработчика — написать работающую программу. Многие так увлекаются этим, что забывают об эффективности такого кода. Разработчики создают настолько громоздкие конструкции, что удивляешься, как это вообще работает.
В сегодняшней статье мы поговорим о том, насколько сложной может быть реализация простых задач, и о том, как этого избежать.
Как вывести «Hello, World»?
Есть такой вариант:
char h = 'H';
char e = 'e';
char l1 = 'l';
char l2 = 'l';
char o1 = 'o';
char w = 'W';
char o2 = 'o';
char r = 'r';
char l3 = 'l';
char d = 'd';
Console.WriteLine("{0}{1}{2}{3}{4}, {5}{6}{7}{8}{9}!",h,e,l1,l2,o1,w,o2, r, l3,d);
Console.ReadKey();
Он работает, но чтобы вывести надпись, приходится создавать слишком много переменных. Давайте попробуем сократить их число.
char h = 'H';
char e = 'e';
char l = 'l';
char o = 'o';
char w = 'W';
char r = 'r';
char d = 'd';
Console.WriteLine("{0}{1}{2}{2}{3}, {4}{3}{5}{2}{6}!",h,e,l,o,w,r,d);
Console.ReadKey();
Уже другое дело, но, может, попробуем массивы?
char[] letters = new char[13];
letters[0] = 'H';
letters[1] = 'e';
letters[2] = 'l';
letters[3] = 'l';
letters[4] = 'o';
letters[5] = ',';
letters[6] = ' ';
letters[7] = 'W';
letters[8] = 'o';
letters[9] = 'r';
letters[10] = 'l';
letters[11] = 'd';
letters[12] = '!';
for (int i = 0; i < 13; i++)
{
Console.Write(letters[i]);
}
Console.ReadKey();
Давайте заменим цикл for на foreach.
foreach (char c in letters)
{
Console.Write(c);
}
Уловили суть? Каждая переменная занимает место в памяти, и чем больше мы их используем, тем тяжелее и медленнее становится программа. Особенно, если такие конструкции используются постоянно.
Курс «C#-разработчик с нуля»
Практический четырех месячный курс для тех, кто хочет овладеть языком программирования с индивидуальным наставником и положить первое десктопное приложение к себе в портфолио.
Программа курса
Мы можем накалить градус шизофрении, создав для этого отдельный метод с рекурсией.
static void Main(string[] args)
{
WriteHelloWorld(0);
Console.ReadKey();
}
static void WriteHelloWorld(int i)
{
char letter = ' ';
switch (i)
{
case 0: letter = 'H'; break;
case 1: letter = 'e'; break;
case 2: letter = 'l'; break;
case 3: letter = 'l'; break;
case 4: letter = 'o'; break;
case 5: letter = ','; break;
case 6: letter = ' '; break;
case 7: letter = 'W'; break;
case 8: letter = 'o'; break;
case 9: letter = 'r'; break;
case 10: letter = 'l'; break;
case 11: letter = 'd'; break;
case 12: letter = '!'; break;
}
Console.Write(letter);
if (i != 12)
{
i++;
WriteHelloWorld(i);
}
}
Сам метод можно вывести в подключаемую библиотеку, чтобы не копировать этот код для каждого нового проекта. На самом деле было бы достаточно написать так:
string text = "Hello, World!";
Console.WriteLine(text);
Console.ReadKey();
Или даже так:
Console.WriteLine("Hello, World!");
Console.ReadKey();
.
Вам также будет интересно:
• На что живут программисты: зарплаты, налоги, регионы и возможности
• Оскорбление чувств пользователей: как быть политкорректным в IT
• Языки программирования сейчас и в будущем. Что и зачем учить?
Ужасный «Hello, World!» на разных языках
Язык C:
#include <iostream>
class AbstractHello
{
public:
virtual ~AbstractHello(){std::cout << " World!";}
void Prnt(){std::cout << "Hello";}
};
class ChildHello: public AbstractHello
{
public:
~ChildHello(){Prnt();}
};
int main()
{
ChildHello *Obj;
Obj = new ChildHello;
delete Obj;
}
Haskell:
{-# LANGUAGE NoImplicitPrelude #-}
import qualified Data.ByteString as BS -- бесполезный импорт. Помог бы автору, но мне тоже лень.
import Data.Foldable (foldl1)
import Data.Function ((.))
import Text.Show (show)
import Data.List ((++))
import Data.Char (Char)
import Control.Monad ((>>=))
import System.IO
main :: IO ()
main = hSetBuffering stdout NoBuffering >>= \ _ -> hSetBuffering stdin LineBuffering >>= \ _ -> putHelloWorld (message1)
where
message :: [[Char]]
message = [ 'H':'e':'l':'l':'o':',':[], 'w':'o':'r':'l':'d':'!':[] ]
putHelloWorld :: [Char] -> IO () -- putHelloWorld = putStrLn
putHelloWorld [] = System.IO.hPutStr stdout ('\n':[])
putHelloWorld (x:xs) = System.IO.hPutStr stdout (x:[]) >>= \ _ -> putHelloWorld xs
message1 = let f = (++) . (++ " "); f1 = foldl1 f
in f1 message
Lisp:
(eval (cons (quote mapcar)
(cons (cons (quote function)
(cons (quote princ) ()))
(cons (cons (quote quote)
(cons (cons #\H (cons #\e (cons #\l (cons #\l (cons #\o
(cons #\, (cons #\Space
(cons #\w (cons #\o (cons #\r (cons #\l (cons #\d (cons #\!
()))))))))))))) ())) ()))))
И десерт — BrainFuck:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++.+++++++..+++.-------------------------------------------------------------------------------.+++++++++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++++++++++++++++.+++.------.--------.-------------------------------------------------------------------.
Заключение
Не усложняйте себе и другим жизнь! Старайтесь найти самое простое решение, иначе вы всю жизнь потратите на элементарные вещи, а на что-то действительно важное времени просто не останется.