Save 37% off PRO during our Black Friday Sale! »

Елементите на стила в програмирането

Елементите на стила в програмирането

Слайдовете от презентацията ми на OpenFest 2014

Efd2550fb5f3059d815e731ecd61b701?s=128

Bozhidar Batsov

November 03, 2014
Tweet

Transcript

  1. Елементите на стила в програмирането от Божидар Бацов

  2. Привет!

  3. None
  4. None
  5. (think) http://batsov.com

  6. Emacs Redux http://emacsredux.com

  7. @bbatsov

  8. bbatsov

  9. Критиците

  10. Кода на Божидар е по-секси от “True Blood”, а статиите

    му са по- брутални от “Game of Thrones”! Пешо Хакеров, сп. Баш Хакер
  11. Божидар редефинира понятието “арогантно надменно копеле”. Настрана от това -

    творчеството му не е лошо. Сийка Сииджиева, в. Модерния програмист
  12. Интонацията му е леко странна. Езикът - скандален! Ентусиазмът -

    заразен! Благо Блогоев, сп. Код и жица
  13. Камен Донев може да научи това-онова за импровизацията от Божидар.

    Руби Рейлсаджиева, в. Късо Съединение
  14. Аз съм перфекционист

  15. size=2 start=0 c=['Н', 'Н' ,'Н' ,'Н' ,'Н','Н','Н','Н','Н','Н','Н','Н','Н','Н'] code_dictionary=Array.new() begin_size_code_dictionary=Array.new() end_string=String.new()

    code_dictionary=c.uniq.to_a decode_dictionary=c.uniq.to_a for i in 0...code_dictionary.size begin_size_code_dictionary[i]=i end c.size.times{ if !code_dictionary.include?(c[start,size].to_s)#Comparation code_dictionary.push(c[start,size].to_s.chomp) start=start+(code_dictionary.last.size)/2-1 size=2 else size+=1; end } end_code=Array.new(code_dictionary.size) for i in begin_size_code_dictionary.size...code_dictionary.size end_code[i]=code_dictionary.index(code_dictionary[i].chop.chop)+1 end_string+=code_dictionary[i].chop.chop end govnokod.ru
  16. Езиците са сложни

  17. None
  18. Използването на език на базово ниво е лесно

  19. Айн-цу-цвайн-цу-дрън

  20. "Ту партс, съмтаймс люн, съмтаймс уин, соу, фърст дей релякс"

  21. Правилната употреба на език е трудна

  22. Ефективната употреба на език е много трудна

  23. None
  24. None
  25. Use the active voice.

  26. My first visit to Stroeja will always be remembered by

    me. lame
  27. I shall always remember my first visit to Stroeja. legit

  28. The word personally is often unnecessary.

  29. Personally, I love Emacs.

  30. Стилово ръководство • подбран набор от (уж) добри практики •

    спестява ви вземането на тривиални решения • позволява ви да се фокусирате върху истинските проблеми • кратко и по същество
  31. Стиловите ръководства не са заместител на мисленето.

  32. Programs must be written for people to read, and only

    incidentally for machines to execute. ' — Hal Abelson
  33. Сходни правила важат за програмните и за естествените езици

  34. None
  35. English

  36. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do

    eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Chapter I
  37. LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO

    EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT. DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR. EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM. LOREM IPSUM DOLOR SIT AMET, CONSECTETUR ADIPISCING ELIT, SED DO EIUSMOD TEMPOR INCIDIDUNT UT LABORE ET DOLORE MAGNA ALIQUA. UT ENIM AD MINIM VENIAM, QUIS NOSTRUD EXERCITATION ULLAMCO LABORIS NISI UT ALIQUIP EX EA COMMODO CONSEQUAT. DUIS AUTE IRURE DOLOR IN REPREHENDERIT IN VOLUPTATE VELIT ESSE CILLUM DOLORE EU FUGIAT NULLA PARIATUR. EXCEPTEUR SINT OCCAECAT CUPIDATAT NON PROIDENT, SUNT IN CULPA QUI OFFICIA DESERUNT MOLLIT ANIM ID EST LABORUM. chapter i
  38. Български

  39. Правителство трябва да има на всяка цена, каза премиерът проф.

    Георги Близнашки пред журналисти в Котел, където беше по повод Деня на будителите. "Силно се надявам, че в следващите няколко дни, особено след като бъде връчен проучвателен мандат, разговорите ще придобият по-спокоен тон и ще се стигне до съставяне на правителство", заяви министър- председателят, цитиран от правителствената информационна служба. Той прогнозира тежки първи месеци за следващия кабинет, който трябва да предприеме неотложни и "не особено популярни мерки". Близнашки изрази надежда, че след това нещата ще тръгнат във възходяща линия, благодарение на финансовия ресурс, предвиден за страната ни по Споразумението за партньорство на ЕК с България до 2020 година. Глава 1
  40. ПРАВИТЕЛСТВО ТРЯБВА ДА ИМА НА ВСЯКА ЦЕНА, КАЗА ПРЕМИЕРЪТ ПРОФ.

    ГЕОРГИ БЛИЗНАШКИ ПРЕД ЖУРНАЛИСТИ В КОТЕЛ, КЪДЕТО БЕШЕ ПО ПОВОД ДЕНЯ НА БУДИТЕЛИТЕ. "СИЛНО СЕ НАДЯВАМ, ЧЕ В СЛЕДВАЩИТЕ НЯКОЛКО ДНИ, ОСОБЕНО СЛЕД КАТО БЪДЕ ВРЪЧЕН ПРОУЧВАТЕЛЕН МАНДАТ, РАЗГОВОРИТЕ ЩЕ ПРИДОБИЯТ ПО-СПОКОЕН ТОН И ЩЕ СЕ СТИГНЕ ДО СЪСТАВЯНЕ НА ПРАВИТЕЛСТВО", ЗАЯВИ МИНИСТЪР-ПРЕДСЕДАТЕЛЯТ, ЦИТИРАН ОТ ПРАВИТЕЛСТВЕНАТА ИНФОРМАЦИОННА СЛУЖБА. гЛаВа 1 ТОЙ ПРОГНОЗИРА ТЕЖКИ ПЪРВИ МЕСЕЦИ ЗА СЛЕДВАЩИЯ КАБИНЕТ, КОЙТО ТРЯБВА ДА ПРЕДПРИЕМЕ НЕОТЛОЖНИ И "НЕ ОСОБЕНО ПОПУЛЯРНИ МЕРКИ". БЛИЗНАШКИ ИЗРАЗИ НАДЕЖДА, ЧЕ СЛЕД ТОВА НЕЩАТА ЩЕ ТРЪГНАТ ВЪВ ВЪЗХОДЯЩА ЛИНИЯ, БЛАГОДАРЕНИЕ НА ФИНАНСОВИЯ РЕСУРС, ПРЕДВИДЕН ЗА СТРАНАТА НИ ПО СПОРАЗУМЕНИЕТО ЗА ПАРТНЬОРСТВО НА ЕК С БЪЛГАРИЯ ДО 2020 ГОДИНА.
  41. Ruby

  42. def some_method do_something do_more do_more end

  43. def some_method do_something do_more do_more end

  44. sum = 1 + 2 a, b = 1, 2

    [1, 2, 3].each { |e| puts e } class FooError < StandardError; end
  45. sum=1+2 a,b=1,2 [1,2,3].each{|e|puts e} class FooError<StandardError;end

  46. English

  47. Form possessive singular of nouns by adding ’s.

  48. Bozhidar’s talk ' Batman’s batclaw ' Emacs’s magic

  49. Ruby

  50. Form predicate method names by adding “?”.

  51. even? ' completed? ' batman?

  52. English

  53. Make the paragraph the unit of composition.

  54. Ruby

  55. Make the method the unit of composition.

  56. English

  57. Omit needless words.

  58. he is a man who

  59. Her story is a strange one.

  60. Ruby

  61. Omit needless words.

  62. if some_condition then # body omitted end

  63. def some_method # ... ' return result end

  64. English

  65. farther ' further

  66. Do we have to go much farther?

  67. I decided to pursue the subject further.

  68. Ruby

  69. == === equal? eql?

  70. Подход към стила

  71. Бъдете консистентни.

  72. English

  73. The user should update his config accordingly. They should also

    check…
  74. The user should update his config accordingly. They should also

    check…
  75. Ruby

  76. def something coll coll.collect(&:ala) end def something2(coll) coll.map { |x|

    x.bala } end
  77. Бъдете ясни.

  78. Български

  79. БМВ

  80. Бързо мощно возило

  81. КТБ

  82. Коварен Терански Батълкруузър

  83. АБПФК

  84. Активен борец против фашизма и капитализма

  85. Ruby

  86. $:

  87. $LOAD_PATH

  88. $;

  89. $FIELD_SEPARATOR

  90. $*

  91. $ARGV

  92. '%d %d' % [20, 10]

  93. sprintf('%d %d', 20, 10)

  94. sprintf( '%{first} %{second}', first: 20, second: 10 )

  95. format('%{first} %{second}', first: 20, second: 10)

  96. Ruby е оптимизиран за програмистко щастие.

  97. Ruby е огромен език

  98. Взимането на “правилни” решения е сложно

  99. puts "Hello, OpenFest!" puts "Hello, OpenFest!" puts "Hello, OpenFest!"

  100. for i in 1..3 puts "Hello, OpenFest!" end

  101. 3.times do puts "Hello, OpenFest!" end

  102. result = [] ' names.each do |word| result << name.upcase

    end
  103. names.map { |name| name.upcase }

  104. names.map(&:upcase)

  105. None
  106. None
  107. None
  108. 56 прости правила

  109. Форматирай програмите по начин, който ги прави по-лесни за четене/разбиране

  110. Пиши ясно

  111. Не се прави на много умен

  112. def user_signed_in? !!@current_user end def user_signed_in? !@current_user.nil? end

  113. Не жертвай четимост за скорост

  114. i = 1 res = 0 while i <= 10

    res += i i += 1 end
  115. (1..10).reduce(:+)

  116. (10 * (10 + 1)) / 2

  117. Оптимизирай посредством по- ефективни алгоритми

  118. • Направи го вярно преди да го правиш бързо •

    Направи го стабилно преди да го правиш бързо • Направи го ясно преди да го правиш бързо
  119. Подобрения в скоростта се отчитат с тестове

  120. Избирай смислени имена

  121. a s l

  122. age sex location

  123. age_over_18?

  124. adult?

  125. Не се повтаряй

  126. Набивай скоби с голямата лопата

  127. x || y && z

  128. x || (y && z)

  129. Гледайте коментарите да съответстват на кода

  130. # This method does bla bla bla. # It returns

    an array of results. def bla_bla_bla res = Set.new # ... res end
  131. bla_bla_bla[0] # => Boom Boom Pow bla_bla_bla.uniq # => Kaboom!

  132. //private instance variable for storing age public static int age;

  133. //private instance variable for storing age public static int age;

  134. //private instance variable for storing age public static int age;

  135. Fuck this shit!!!

  136. Не повтаряйте кода в коментари. ' Всеки коментар трябва да

    носи допълнителна яснота.
  137. # increment counter by 1 counter += 1

  138. Не коментирайте скапания код - оправете го.

  139. // // 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 //
  140. Стилови ръководства за конкретен език

  141. Python

  142. PEP-8 http://legacy.python.org/dev/peps/pep-0008/

  143. Java

  144. Sun Style Guide http://www.oracle.com/technetwork/java/codeconvtoc-136057.html

  145. Google Style Guide https://google-styleguide.googlecode.com/svn/trunk/javaguide.html

  146. Go

  147. Effective Go https://golang.org/doc/effective_go.html

  148. gofmt

  149. None
  150. Airbnb Style Guide https://github.com/airbnb/javascript

  151. Google Style Guide https://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml

  152. None
  153. PHP FIG Coding Style Guide http://www.php-fig.org/psr/psr-1/ http://www.php-fig.org/psr/psr-2/

  154. WAT?

  155. None
  156. Ruby Style Guide https://github.com/bbatsov/ruby-style-guide

  157. None
  158. Clojure Style Guide https://github.com/bbatsov/clojure-style-guide

  159. Еволюция на стила

  160. { :batman => 'Bruce', :superman => 'Clark', :zorro => 'Diego',

    :catwoman => 'Selina' }
  161. { batman: 'Bruce', superman: 'Clark', zorro: 'Diego', catwoman: 'Selina' }

  162. Community Personal Project Company

  163. Community Project Company

  164. Без стил няма класа.

  165. Край