argon bulletin board

Експертно търсене  

Новини:

Регистрирането на нови потребители е временно деактивирано.

Автор Тема: Какъв код предпочитате да пишете и четете  (Прочетена 6926 пъти)

VooDooMaN

  • Гост

Сложен и труден за разбиране или прост и очевиден :)?
Не се ли чувствате горди след като разберете един добре съчетан код спагети :)?
Убеден съм, че има хора които се кефят на операторите за побитово отместване в C++ например :).
Активен

Valdorval

  • Неактивен Неактивен
  • Публикации: 87

Искам да чета всичко дето е код.
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org

Предпочитам да пиша код, който е качествен. До колко е очевиден, това е субективно. Но ако нещо може да се направи по прост и елегантен начин, винаги предпочитам този подход.

А операторите за побитово отместване не знам що ги намеси. Ако за някой те правят кода "сложен и труден за разбиране", направо не ми се мисли...

Поздрави,

Николай Манчев
Активен

VooDooMaN

  • Гост

Лош пример, признавам :).
Активен

seemore

  • Неактивен Неактивен
  • Публикации: 16

Наистина мн кофти пример :) Кои не обича да чете елентно написан код??? Иначе всичко де що се чете е ОК  :-D
Активен

TeeRexX

  • Неактивен Неактивен
  • Публикации: 739
  • изпратете ми анонимно пари в плик :)
    • www.myspace.com/teerexx

Обичам да чета мой код, щото си се радвам  :mrgreen:
Активен

VooDooMaN

  • Гост

Със собствен код е ясно, проблемът основно идва като почне да се чете чужд код :).
Активен

Jack Johnson

  • Неактивен Неактивен
  • Публикации: 704
  • Хора, пазете си здравето! То няма цена!

Едно малко, но хубаво отклонение от темата:

В термините на Java каква ще бъде стойността на i след изпълнението на редове 2 и 3?

1: int i = -1;
2: i >>> 1;  // i = ???
3: i++;  // i = ???
Активен

VooDooMaN

  • Гост

Как по-конкретно ще се изпълни въпросния код?
Ще се изпълни ли въобще?
Примерът е много хубав. Налагало ли ти се е да го ползваш някъде ?
Простете ми за некомпетентността, но въпросния втори ред не ми говори нищо и направо не ми се мисли...
Активен

Jack Johnson

  • Неактивен Неактивен
  • Публикации: 704
  • Хора, пазете си здравето! То няма цена!

Ред 2) i = Integer.MAX_VALUE.

От двоично число с 32 единици получаваме двоично число, което започва с 0 ("нула") и има 31 на брой единици. В рамките на правилата за прав код (това е положително число и правият, обратен и допълнителен код съвпадат), това е точно Integer.MAX_VALUE.

Ред 3) i = Integer.MIN_VALUE

В ред 3 след извършване на аритметичната операция се получава "препълване", което е "препълване" само на пръв поглед. Ако към двоично число, състоящо се от една нула и 31 единици прибавим още една единица получаваме двоично число, състоящо се от една единица и 31 на брой нули. Според правилата на допълнителния код това е точно Integer.MIN_VALUE.

Абсолютно никъде и никога не ми се е налагало да пиша такъв код, това съм го виждал само по разни тестове. На практика ако аз видя такъв код бих уволнил човека, който го е написал. В моя случай - това значи да си подам оставката :)

P.S. Петък е, а и наближава полунощ. Ако не съм дал точно обяснение, моля някой да ме поправи.
« Последна редакция: 27.01.2006, 23:15:57 от Иван Давидов »
Активен

VooDooMaN

  • Гост

:) Ето защо не ми се компилира кода - бил е от тестове ;).
Активен

Valdorval

  • Неактивен Неактивен
  • Публикации: 87

NO COMMENT!!!!!!!!!!  :-D
Ами VooDooMan ако искаш мога да ти посоча някои книшки в които има някъкви базици. Когато преди доста време трябваше да чета и да пробвам някакви примери на Pascal писани от някакъв преподавател може ли да си представиш че половината и повече даваха грешки или изобщо не тръгваха. Виж сега ти.

                                                                              Поздрави,
                                                                               Valdorval 

Активен

JOKe

  • Неактивен Неактивен
  • Публикации: 2656
  • Code or Die

От Форум :
Ползвайте условния оператор ?
Винаги когато имате случай който може да се интерпретира като:

if(конете_могат_да_летят)
 a=уха;
else
 a=жалко;
//Го свеждайте до:
a=(конете_могат_да_летят)?уха:жалко;
Изглежда много засукано и сложно и всички ще се впечатляват. Изследвайте внимателно всички условни конструкции, защото възможност за оператор ? може да се крие навсякъде. Можете да го влагате, да го пъхате на най различни места и въобще да правите як и трудно-четим код. Внимавайте обаче с това къде го пъхате. В условия на цикли ще направи програмата по-бавна.

Като цяло не може да ви донесе никаква полза освен по-малко писане. Бързината му е идентична с тази на if структурата.

Гъзария: 6/10
Реална полза: 3/10 //по малкото писане си струва :)
Правете коментар-шаблон
С++ е интересен език. Когато направите шаблонна функция, той не я компилира и въобще не я пипа докато не я извикате. Така че ако имате коментар, който съдържа сорс-код, без да е коментиран сорс-код, е приятно да е шарен като останалите си, изпълняващи се събратя. Пример:

//======================================
template <class T> void
COMMENT
() {
долната функция се използва така
int n=nekva_funkcia()
dolna_funkcia(h);
може да хвърли ексепшън, за това слагайте
и try catch блок
}//=====================================
void dolna_fukcia(int n) {...}
Ще пишете малко повече, обаче е изненадващо приятно да четеш оцветени коментари... :)

Гъзария: 8/10
Реална полза: 2/10
Индексирайте число с указател
Ами тъй като в С и С++, операторът [], в случай че не е предефиниран, просто прибавя едно число (указател), към друго (индекс), можем да правим следните калабалъци:

int ar[10] = {...};
for(int i=0; i<10; ++i)
   cout << i[ar];
За съжаление (a може би и за щастие) с двумерни масиви не става. Там операцията е малко по-различна. Друг е въпроса че прави кода ужасно объркан и може да докара до инфаркт някой не достатъчно запознат със тънкостите на езика.

Гъзария: 9/10
Реална полза: 1/10
Правете празни цикли
Поради огромните възможности на for, можем да сместим голяма част от това което трябва да прави в самия него. Например:

//просто
for(int i=0; i<10; ++i)
  cout << ar;
//->
for(int i=0; i<10 && (cout << a); ++i);

//сложно
s=x;
for(i=0; i<N; ++i) {
  cout << s << ' ';
  s+=a;
  if(i>5)
    a=8;
  else
    a=10;
}
//->
for(i=0, s=x; i<N && (cout << s << ' '); ++i, s+=a, a=(i>5)?8:10);
Е понякога нещата не е препоръчително да се усложняват толкова, обаче има и случаи, в които е полезно. (Не ме питайте за такива!) Факт е че цели програми могат да се вместят в един for.

Гъзария: 7/10
Реална полза: 3/10
Индексирайте литерали
Стриговите литерали от вида "аз съм стрингов литерал хахахаха", са интересно нещо, защото езикът ги интерпретира като const char*. И както можем да индексираме const char*, така можем и стринговия литерал. С помощта на няколко от горните съвети можем да направим интересна операция за изписване на текст.

int i=0;
while(putchar(i++["О боже! Къде ме набутаха?!?"]));
Гъзария: 9/10
Реална полза: 2/10 //абе аз по принцип не съм фен на литералите за това
Викайте main
За съжаление в С++ тази операция е забранена, обаче С програмистите могат да се повеселят с програми като тази:

int main(int argc)
{
  if(argc==0)
    return 0;
  printf("%d ", main(argc-1))
  return argc;
}
И като извикате "ludnica.exe a a a a a a" ще изкара резултат "0 1 2 3 4 5". Яко! Едва ли има и 1 на милион програми, в които това има макар и микроскопичен смисъл (продължавайте да не ме питате за такива!), но все пак изглежда шашаво. Още си спомням с умиление оцъкления поглед, когато видях такова нещо за първи път...

Гъзария: 10/10
Реална полза: 2/10
Естествено има и хиляди други примери за шашав, грозен и безполезен код. Чудесата които можете да направите само с #define са неизброими. Тези по-простички "съвети" ми хрумнаха сега. Ако се сетя още (простички) ще допълня.

П.П. ако случаино съм наръшил някои лиценз сажелявам просто не видях под какъв лиценз са примерите на саита от който ги взех .
иначе те са от : http://sourcecore.net/article.php?id=28
Author : iboB
Активен

artanis

  • Неактивен Неактивен
  • Публикации: 589
    • http://free.hit.bg/artanis

Псевдокод  :-D
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org

Е, то ако е за простотията... С помощта на едно такова Java класче:

public class Basic {
 
  protected static final class GotoException extends RuntimeException {
    private GotoException() {}
  }

  private static final GotoException gotoEx = new GotoException();
   
  public static int jump=10;
 
  public static void GOTO(int line) {
    jump = line;
    throw gotoEx;
  }
 
  public static void STOP() {
    GOTO (-1);
  }

  public static void PRINT(String s) {
    System.out.println(s);
  }

  public static void PRINT(int i) {
    System.out.println(i);
  }

  public static int[] DIM(int n) {
    return new int[n];
  }

  public static double RND() {
    return Math.random();
  }

  public static int INT(double d) {
    return (int)d;
  }
 
}

Може да се напише следното стандартно сортиране на хм... Java или Basic - въпрос на гледна точка  :-D

public class Bubble extends Basic {


  public static void main(String[] args) {
    int I=0;int S=0;int N[] = null;
    while(jump != -1) {
      try {
        switch(jump) {

          case 10: N = DIM(10);
          case 20: I = 0;
          case 30: N = INT(1000 * RND());
          case 40: I = I + 1; if (I < 10) GOTO (30);
          case 50: S = 1; I = 0;
          case 60: if( N < N[I + 1]) GOTO (80);
          case 70: int T = N ; N = N[I + 1] ; N[I + 1] = T ; S = 0;
          case 80: I = I + 1 ; if (I < 9) GOTO (60);
          case 90: if (S == 0) GOTO (50);
          case 100: I = 0;
          case 110: PRINT (N);
          case 120: I = I + 1; if (I < 10) GOTO (110); 
          case 130: STOP();       

        }
        // if there was no GOTO then we want to end the program
        STOP();
      } catch(GotoException ex) {
        // GOTO was called, and a GotoException has caused the
        // control to pass outside of the switch statement
      }
    }     
  }
}

Резултат от изпълнението:

82
297
302
353
468
631
689
787
893
981

Предлагам някой друг да му сложи рейтинга за гъзария/реална полза  :wink:

Поздрави,

Николай Манчев
Активен

VooDooMaN

  • Гост

С колко аспирина е препоръчително да се чете това  :?
Активен

Nikolay Manchev

  • Неактивен Неактивен
  • Публикации: 185
    • http://www.manchev.org

С колко аспирина е препоръчително да се чете това  :?

Друго се ползва в случая. Аспиринът е за сутринта  :-)
Активен

Tosh

  • Неактивен Неактивен
  • Публикации: 249
  • Filmmaker
    • Изследванията на Тодор Арнаудов

Яко! :lol:

Гъзария: 10/10

Кодът на Николай много кефи програмисти, закърмени с класически BASIC, асемблери и машинни езици. Дори след като овладеят Паскал, С и С++, те обичат GOTO, въпреки предупрежденията на смятащите се за "правоверни", че това било "лош стил", "не можело да се чете", "не можело да се поддържа" и др. подобни.

Давам оценка 10 и защото кодът е гъзария навярно и според верните и фанатични поклонници на Вирт и Дейкстра, които настръхват от GOTO, сънуват кошмари от Асемблер, и получават страхова невроза от машинни езици. Съчетанието между JAVA и GOTO за тях е светотатство.

Полезност: 10/10

Чудесно показно за способностите за "езикова мимикрия" и емулация на език от по-ниско ниво чрез език от по-високо, и по този начин - демонстрация на изчислителната пълнота и следствията от нея.

;)
« Последна редакция: 31.01.2006, 14:18:28 от Tosh »
Активен
Творчество и изследвания:
http://twenkid.com
http://artificial-mind.blogspot.com

Райчо Мукелов

  • Неактивен Неактивен
  • Публикации: 486
  • I snuggle with subwoofers
    • HULTIG - Human Language Technlogy and Bioinformatics Interest Group

tc tc  :-D
Активен

prestor

  • Неактивен Неактивен
  • Публикации: 62

Според мен кодът трябва да е максимално разбираем и ефективен!
Активен