Надмірне використання або зловживання методами програмування [закрито]


38

Чи є якісь методи в програмуванні, якими ви вважаєтесь надмірно використаними (IE використовується набагато надмірно, ніж вони повинні бути), або зловживали ними, або використовували трохи для всього, хоча вони не є справді хорошим рішенням багатьох проблем, які люди намагаються вирішити вирішити з цим.

Це можуть бути регулярні вирази, якась схема дизайну або, можливо, алгоритм, або щось зовсім інше. Можливо, ви думаєте, що люди зловживають багаторазовою спадщиною тощо.


33
Я погоджуюся, що IE використовується набагато надмірно, ніж це має бути, але це в першу чергу непрограмісти. . .
Ерік Вілсон

7
@FarmBoy - Я думаю, що він мав на увазі IE: "Тобто" означає просто "тобто", яке повністю виписано латинською мовою - "id est".
Рафаель

Виправлено це зараз :)
Анто

4
Будь-яка техніка може (і часто її зловживають), її просто потрібно подати як наступну срібну кулю, і ви знайдете того, хто ставиться до кожної проблеми як до цвяха (змішувати метафори).
ChrisF

8
@Rapheal - я жартував, звичайно. Дякую за освіту.
Ерік Вілсон

Відповіді:


73

Коментарі в кодексі

Я просто хочу, щоб викладачі університету розуміли, що їм не потрібно вчити своїх студентів писати 10 рядків коментарів, в яких говориться, що наступний код - це цикл для циклу, який повторюється від 1 до числа x. Я бачу це в коді!

Навчіть їх спочатку писати код самодокументування, а потім відповідне коментування того, що не може бути адекватним самодокументуванням другого. Світ програмного забезпечення був би кращим місцем.


26
Код самодокументування не є. Також професори роблять це, щоб навчити студентів концептуалізувати проблему та як до неї підійти. Крім того, я ніколи не бачив, щоб хтось скаржився на занадто багато документації. Документація є документацією правильною.
Woot4Moo

24
@ Woot4Moo: якщо ви читаєте Clean Code, Фоулер чітко заявляє, що застаріла документація гірша, ніж жодна документація, і що всі коментарі мають тенденцію старіти та мігрувати подалі від коду, який вони документують. Ціла книга - це те, як писати код самодокументування.
Скотт Вітлок

12
Навчити їх замінювати коментарі кодом було б гарним початком ...
Shog9

15
+1. Я фактично бачив у реальному світі код: "loopVar ++; // приріст loopVar". AAAAAAAAAAAAARRRRRGH!
Столи Бобі

7
@Bill: Я вважаю, що вам не потрібно документувати загальні логічні структури та структури управління, навіть якщо вони відносно складні. В основному, все, що повинен розробити хороший розробник, який знає мову, аналізуючи код, не потрібно коментувати. напр. Набір вкладених циклів з деякими розривами всередині них і т. Д. Але те, ЩО БУТЕ коментувати, - це мотивування, пов’язане з додатком, чому код приймає ці рішення: наприклад. "Якщо завтра новий програміст запуститься в компанію і подивиться на код, чи має це сенс без натяків на коментарі?"
Столи Бобі

57

Однотонний шаблон дизайну.

Звичайно, це корисна модель, але щоразу, коли новий програміст дізнається про цей шаблон, він починає намагатися застосовувати його для кожного створеного ним класу.


Я використовую цей погано розроблений привід для рамки щодня. codeigniter.com/user_guide/libraries/email.html Вони думають, що OOP має функцію префіксації за допомогою $this->. PHP - гнила мова, тому я не можу очікувати, що рамки будуть чудовими.
Кейо

7
Я думаю, що будь-який програміст, який реалізує сингла і не покається, згорить у вогненному пеклі за гріх, який він (або вона) здійснив.

2
Я реалізував одиночку в своїй професійній кар'єрі (в багатозадачному контексті), і мені довелося покаятися за свій гріх, переписавши його.
Спіке

3
Синглтони можуть бути корисними для кількох речей, але майже завжди використовуються, коли їх не має бути. Це не означає, що одинакових ніколи не слід використовувати - лише тому, що чимсь зловживають, не означає, що його не можна правильно використовувати.
конфігуратор

2
@Rapahel: Саме тому я не вважаю, що вивчення моделей дизайну є хорошою справою.
конфігуратор

53

Найгірше захистити німе програмування. вкладаючи все в спробу лову і нічого не роблячи з уловом

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

Я здригаюся, коли бачу спробу лову, який нічого не робить, і призначений для обробки логічної логіки. Як правило, спробу лову надмірно використовують, проте в деяких випадках вони дуже корисні.


4
Смішна річ - я щойно редагував файл, який робить це сотні разів, і з поважної причини. Це одиничний тестовий файл, тестуючи, що різні методи кидають виняток, коли очікується. Спробувальний блок містить виклик і звіт про "очікуваний викид не відбувся". Виняток очікується і правильно, тому коригувальних дій немає. Очевидно, що одиничні тести - це особливий випадок, але у мене були подібні випадки в реальному коді. Червоний прапор, так, але не є абсолютним правилом.
Steve314

5
@ Укладіть описаний вами випадок - це рідкісний край. Ще один, про який я можу придумати - це реєстрація коду - якщо сам журнал не вдається, немає сенсу намагатись увімкнути виняток або перервати додаток.
dbkk

1
@dbkk - погодився з крайовою умовою, і я додам, що коли вам справді потрібно зробити виняток, але не потрібно коригувальних дій, додавши коментар у блок вилучення, щоб пояснити, що важливо, якщо тільки заспокоїти утримувачі. Це не так вже й рідко в одиничних тестах, тож я б відмовився від коментаря в цьому випадку.
Steve314

5
про помилку резюме далі
jk.

2
@ jk01 - виняток не є (обов’язково) помилкою. Будь-яка умова є помилкою чи ні, залежить від контексту. Наприклад, "файл не знайдено" не є помилкою, якщо файл вам не потрібен. Можливо, це просто необов'язковий файл налаштувань, який може бути, а може і не бути, і ви можете просто залишити свої за замовчуванням на місці, якщо файлу там немає (тому ніяких коригувальних дій не потрібно після вибору).
Steve314

47

Покладайтеся на StackOverflow для вирішення своїх проблем, а не роздумуйте про важкий шлях.

Нові програмісти, які знаходять багатство знань на SO (занадто часто), перш ніж подумати і спробувати речі.

У мої дні нам доводилося кодувати з книг, ні в Інтернеті, ні в SO. Тепер зійди з моєї галявини.


28
Треба зізнатися, я дрімаю від зухвалість деяких питань щодо ТА. Або тому, що їх запитують багато разів щодня, і вони, очевидно, зовсім не шукали; або ще гірше, вони ставляться до громади як до безкоштовної аутсорсингової послуги.
Увімкнення

2
@dbkk: stackoverflow.com/questions/4665778 / ... -> перший коментар «Ви коли - небудь спробувати це?»
Матьє М.

5
Я почав вчитися з книжок, але одного разу, коли я мав фундамент, я майже все інше дізнався з обговорень на форумі. Не запитуючи, а головним чином (і спочатку виключно) читаючи. Цей метод навчив мене декількома мовами програмування в глибокій глибині (з великою кількістю куточків і криниць), і я думаю, що це зовсім не поганий метод.
Конрад Рудольф

1
@Konrad Rudolph: Цей метод хороший і мудрий, читаючи запитання, добре шукаючи. Запитання найкраще проводити, коли у запитувача є рамки, з якими можна зрозуміти відповіді. Занадто часто люди задають питання, які вони ще (ще) не здатні зрозуміти.
Увімкнення

3
Проблема полягає в тому, що ТАК заохочують це, надаючи багато відповідей на запитання / відповіді на дуже просте запитання, на яке можна відповісти простим пошуком Google. На дуже важке запитання люди відповідають лише тому, що дуже хочуть.
IAdapter

36

OOP очевидно. Це дуже цінно, але при неправильному використанні він може легко приховати ясний код в іншому випадку (деякі приклади програмування S4 в R приходять в голову), і може дати величезні накладні витрати, які не потрібні і можуть коштувати великих витрат на продуктивність.

Інша справа, що (наприклад, Perl) OOP часто зводиться писати те ж саме навпаки: result = $object ->function(pars)замість result = function(object, pars)цього іноді має сенс, але при змішуванні з процедурним програмуванням це може зробити читання коду досить заплутаним. І крім цього, ви просто вводите більше накладних витрат там, де це не покращує дизайн. Це зводиться до того, що сказано про однотонну схему: слід використовувати, але не на все.

Я використовую OOP сам, але в моїй галузі (наукові обчислення) продуктивність - це велика справа, і OOP часто зловживають там, оскільки всі студенти зараз отримують Java. Він чудово підходить для вирішення більших проблем, для концептуалізації тощо. Але якщо ви працюєте з, наприклад, послідовностями ДНК у BioPerl, використання об'єктів кожного разу та послідовно працюючи з геттерами та сеттерами може вдвічі збільшити час обчислення. Якщо ваш код працює кілька днів замість кількох годин, ця різниця дійсно має значення.


6
@Craige: Я використовую OOP сам, але в моїй галузі (наукові обчислення) продуктивність - це велика справа, і OOP часто зловживають там, оскільки всі студенти зараз отримують Java. Він чудово підходить для вирішення більших проблем, для концептуалізації тощо. Але якщо ви працюєте з, наприклад, послідовностями ДНК у BioPerl, використання об'єктів кожного разу та послідовна робота з геттерами та сеттерами може в десятки разів збільшити час обчислення. Якщо ваш код працює кілька днів замість кількох годин, ця різниця дійсно має значення.
Joris Meys

1
@Craige: Методи ланцюга (як Foo.DoX().DoY().DoZ()) приємно, але, але, безумовно, це не єдиний спосіб зробити щось. Композиція функцій (на кшталт doZ . doY . doX $ fooідеально допустима альтернатива.
Anon.

1
@Joris: щось, про що я довго замислювався (сам біоінформатор): якщо продуктивність важлива настільки, навіщо використовувати Perl в першу чергу замість C ++? Якщо ви турбуєтесь про те, щоб позбутися фактора 10 від часу виконання (дійсне занепокоєння!), То перехід на C ++ дає вам миттєве задоволення Звичайно, мова смокче ... але тоді, як і Perl ... і є хороші бібліотеки біоінформатики для C ++.
Конрад Рудольф

1
@Konrad: Це залежить. BioPerl, мабуть, найбільше пакетів для біоінформатиків з усіх мов (я вважаю, що Python наздоганяє). Плюс до цього було зроблено багато роботи в Perl, і адаптувати сценарій простіше, ніж переписати все на C ++. Нарешті, він не служить для написання повної програми, коли буде виконаний сценарій. Здогадайтесь, тому Perl все ще так багато. І якщо чесно, я не заперечую, мені подобається мова. Це все-таки найкраще, що я знаю для роботи з рядками та файлами. Розрахунки, очевидно, проводяться іншими мовами і пов'язані назад (що йде досить просто).
Йоріс Майс

1
@Konrad: це залежить від того, як це зробити. Можна зробити все в Perl, але Perl можна легко пов’язати з іншими інструментами, особливо в Linux. Я часто використовую Perl як передовий bash-скрипт із сильною обробкою рядками та легкою побудовою наборів даних, які можна перенести в інші програми.
Joris Meys

27

Провівши кілька років у веб-формах ASP.NET, я б сказав однозначно:

Розумний інтерфейс користувача

Незважаючи на те, що в веб-формах цілком можливо створити шаруваті, тестовані програми, Visual Studio дозволяє розробникам занадто легко клацати в один клік, щоб вони були щільно пов'язані зі своїм джерелом даних, з логікою програми, що міститься навколо всього коду інтерфейсу користувача.

Стів Сандерсон пояснює цей антидіапазон набагато краще, ніж я міг у своїй книзі Pro ASP.NET MVC:

Щоб створити додаток Smart UI, розробник спочатку створює інтерфейс користувача, як правило, перетягуючи серію віджетів користувальницького інтерфейсу на полотно, а потім заповнює код обробника подій для кожного можливого натискання кнопки чи іншого події інтерфейсу. Вся логіка додатків знаходиться в цих обробниках подій: логіка приймати та перевіряти введення користувача, здійснювати доступ до даних та зберігання даних та надавати зворотній зв'язок шляхом оновлення інтерфейсу користувача. Вся програма складається з цих обробників подій. По суті, це те, що зазвичай виходить за замовчуванням, коли ви ставите новачка перед Visual Studio. У цьому дизайні не існує жодного розділення проблем. Все злито разом, влаштоване лише з точки зору різних подій інтерфейсу, які можуть статися. Коли логіку чи ділові правила потрібно застосовувати у кількох обробниках, код зазвичай копіюється та вставляється, або певні випадково вибрані сегменти враховуються в статичні класи корисності. З такої кількості очевидних причин такий тип дизайну часто називають антидіаграмою.


1
GUI - це принаймні якийсь код специфікації, якого слід дотримуватися. Я не думаю, що програмісти, яких він описує, зробили б краще, якщо натомість представили файл із порожнім текстом.

4
@qpr, я не знаю про це. Якби у них був порожній текстовий файл, вони могли б не зробити нічого (що може бути просто бонусом).
Кен Хендерсон

Однією з багатьох переваг використання WPF є те, що реалізація MVVM розбиває цей антидіапазон у мізерні місця.
Роберт Россні

2
У тисячу разів це. Я навіть бачу досвідчених розробників .NET, що покладаються на цю "схему", тому що це простіше, ніж розуміти чи піклуватися про розділення проблем. Навіть якщо вони не використовують майстрів перетягування і перетягування, найпоширеніший "зразок" в розробці .NET WebForms полягає в тому, щоб робити все в рамках подій за кодом і копіювати / вставляти код за потребою.
Уейн Моліна

23

Я бачу це періодично, і це зазвичай є результатом не повністю розуміння булевих виразів.

if (someCondition == true)

16
Це має перевагу в тому, щоб зробити код більш явним
Pemdas

7
Думаю, погляньте на це питання в порядку: programmers.stackexchange.com/questions/12807/…
gablin

5
Я цього не роблю, але, серйозно, переборюю. Там пекло набагато гірше. :)
MetalMikester

4
Якщо ви назвали свої змінні належним чином, наприклад bool, починаючи з isабо has, вам не потрібно робити свій код більш явним = true.
Ніхто

3
@DisgruntledGoat тому, що він взагалі не повинен використовуватися
Corey

19

Повторне виконання основних (або наданих іншим чином) функціональних можливостей або через незнання його існування, або через усвідомлену потребу в налаштуваннях.


2
Навчання - виняток. Вивчаючи що-небудь, часто вигідно «винаходити колесо».
Maxpm

Напевно - я мав би вказати, що це актуально лише при створенні виробничого програмного забезпечення.
l0b0

1
Це особливо погано при впровадженні будь-чого, що стосується безпеки. Гарне програмне забезпечення для запобігання атакам, про які більшість людей навіть не думає.
Девід Торнлі

Я бачу такий спосіб занадто поширеним. Нам потрібен X, давайте напишемо своє! А як щодо пакета Y з відкритим кодом? Ні, нам потрібне спеціальне програмне забезпечення для наших надпотаємних комерційних таємниць, які є такими ж, як і всі в нашій галузі, ми не можемо використовувати загальне програмне забезпечення для сміття!
Уейн Моліна

18

Спадщина.

Не примусово виконувати це - де це не має сенсу.


6
Проблема полягає в тому, що інтуїтивно "є-а" дуже часто має сенс (зокрема, оскільки кожне виконання / контрактні відносини можуть розмовно виражатися як "є-а"). Це вимагає чіткого розуміння ООП, щоб зрозуміти, що це насправді помилка, і що успадкування та реалізація інтерфейсу принципово відрізняються.
Конрад Рудольф

@Konrad - згоден абсолютно. Я намагаюся заохочувати людей починати склад , переходити на інтерфейси і вважати спадщину останньою. (Як правило, звичайно). Але, можливо, це мій фон VB, який розмовляє ... ;-)
Майк Вудхаус

1
Це значною мірою питання дизайну мови. Причина, чому вам слід «віддавати перевагу складові над (реалізацією) успадкування» в таких мовах, як Java або C #, полягає в тому, що успадкування впровадження відстежує ці мови. Деякі люди критикують об'єктно-орієнтоване програмне забезпечення Бертрана Мейєра за надмірне використання спадщини, але коли ви насправді дивитесь на Ейфеля (мову, що використовується в книзі), ви розумієте, що він був розроблений для успадкування впровадження , і тому насправді нормально використовувати спадщину над композиція. У такому разі, принаймні.
Йорг W Міттаг

14

Налаштування програмного забезпечення, що не використовується на постійній основі.

Хоча я можу визнати, що це може бути корисним, але мені цікаво, скільки грошей витрачається на те, щоб зробити дрібниці для сумнівної вигоди. Тут компанія може витратити сотні тисяч, якщо не мільйони доларів на ліцензії на певне програмне забезпечення, яке потім налагоджується, оскільки воно настільки конфігурується, редагується та є гнучким, що воно за замовчуванням не робить багато. Зрештою, це спеціальне додаток, оскільки до всього нового коду додано те, що спочатку було придбано.


Чи не так це у випадку зі спеціальним додатком?
JeffO

13

Використання complier як налагоджувач.

Ігнорування попереджень про компілятори або їх повне вимкнення.

Глобальні змінні.


18
Що поганого в "використанні компілятора як налагоджувача"? Величезною перевагою є компілятор, який може вказувати на помилки у вашому коді до того, як вони стануть проблемою.
Мейсон Уілер

3
Я покладаюся на компілятор, який виявляє мої синтаксичні помилки та неправильні помилки відповідності типу. Для поведінкових помилок я покладаюся на тестові випадки.
габлін

5
Проблема полягає в тому, коли ви починаєте залежати від компілятора, щоб забезпечити правильність програми. Це компіляція? Ні, дозвольте мені зафіксувати цей невеликий розділ і побачити, чи це виправлено. Він склав? Ні, дозвольте мені додати * тут і там і подивитися, чи компілюється. ... ект. Очевидно, це корисно для виправлення друкарських помилок
Пемдас

2
Ви кажете, що ніби кодер сліпо колупається в темряві, намагаючись зробити щось - що завгодно - щоб змусити код якось зібрати. Це не так, як працює IME; компілятор дає вам корисне повідомлення про помилку і вказує на місце помилки, і зазвичай, якщо щось не компілюється, це новий код, який ви самі написали, тож ви маєте гарне уявлення про те, що не так, і як це виправити, як тільки це було вказано з. (Хоча якщо ви кидаєте випадкові * s навколо, ви, можливо, працюєте в C ++, де помилки компілятора, як відомо, є надзвичайно корисними, тому те, що я сказав, може не застосовуватися.)
Мейсон Уілер

3
Покладаючись на компілятор працює дуже добре, враховуючи досить міцну систему типу та добре набрану базу коду. Часто система типу може моделювати важливі обмеження, для яких вам доведеться писати тести (наприклад, у слабко набраних системах). Тож використовуваний з розумом, компілятор (і особливо його перевірка типів) - чудовий актив для тестування та налагодження, і немає нічого поганого в тому, щоб покластися на нього. Зокрема, неправильно сказати, що компілятор може показувати лише синтаксичні помилки.
Конрад Рудольф

11

Усі шаблони дизайну.

Вони схожі на сіль або цукор. Деякі з них на вашій їжі роблять її чудовою, багато з них робить вашу їжу відстійною.

Не зрозумійте мене неправильно. Шаблони дизайну - чудові прийоми. Я їх багато використовував. Але іноді я знаходжу програмістів (дехто з них моїх колишніх начальників), які мали такі "ти мусиш використовувати схему дизайну", навіть якщо це не відповідає проблемі !!!

Одним із прикладів є "Візерунок відвідувачів", який більше спрямований на "Лінійні / Послідовні колекції". Мені довелося колись працювати зі структурою даних про дерево. Для того, щоб "відвідати" кожен предмет, я кодую недизайнний шаблон, і колишній начальник наполягає на використанні або адаптації "Шаблону відвідувачів". Потім я переглядаю мережу, для другої думки. Що ж, інші програмісти мали таку ж ситуацію і таке ж рішення. І називаємо це "Дерево / Ієрархічний шаблон відвідувачів"., Як НОВА модель дизайну

Я сподіваюся, що його додали як новий зразок до існуючих, у новій версії книги "Шаблони дизайну".


3
Я ніколи не використовую шаблони дизайну, хоча вони іноді природно з'являються в моєму коді.
конфігуратор

Як йде приказка? Починаєш використовувати шаблони, не знаючи, що ти їх використовуєш, потім дізнаєшся про них і використовуєш їх всюди, тоді вони стають другою природою, тож ти починаєш використовувати їх, не знаючи, що ти їх використовуєш?
Уейн Моліна

2
@configurator Коли я читаю про шаблони дизайну; Я також виявляю, що я та інші розробники, де вже використовують деякі з них ;-)
umlcat

9

Використання винятків як контролю потоку. Сорт подібний до цієї відповіді , але різний.

Проковтування винятків є поганою формою, оскільки воно вводить таємничі, важко знайти помилки в коді. Використання винятків як контролю потоку, з іншого боку, погано, оскільки робить код набагато неефективнішим, ніж міг би бути, і є концептуально неохайним.

Поводження з винятками має використовуватися лише для обробки справді виняткових (так), непередбачених сценаріїв, а не для таких випадків, як користувач, що вводить алфавітний символ, де очікується число. Цей вид зловживань винятком надзвичайно поширений серед поганих програмістів у світі Java.


Винятки для неефективного коду залежать від вашої мови - створення кадру стека тощо. У програмі Squeak ваш стек повністю змінено, тому різниці між використанням винятків чи ні. (Іншими словами, винятки є частиною бібліотеки, а не мовою.) Однак це заплутало роботу з керованим винятком контрольним потоком: lshift.net/blog/2011/01/04/try-again-with-exceptions shows винятки, що використовують цикл, які я нещодавно знайшов.
Френк Шірар

Щодо останнього абзацу, знову ж таки, це залежить від вашої мови. Винятки ("умови") у Common Lisp є суворим набором ідей винятків більшості мов. Дивіться приклади тут: gigamonkeys.com/book/… Як і у всьому, ви можете зайти занадто далеко!
Френк Ширар

Читання та ремонтопридатність переважає ефективність. Випадки, коли я буду використовувати винятки для успіху (на що я маю на увазі, що ви маєте на увазі "контроль потоку"), дуже рідкісні, але вони можуть дати більш чистий код, наприклад, у складному рекурсивному пошуку. Загалом, я згоден. Наприклад, у мене є контейнери з методами ітератора, які повертають помилкові для виходу з діапазону (поширений наприкінці ітерації), але викидають виняток, якщо ітератор "null" (ймовірний ознака якоїсь внутрішньої непослідовності)
Steve314

7

Я буду їхати з негнучкістю через надмірне приховування даних.

Всі ми знаємо, що абстрагування та приховування реалізації - це добре, але більше не завжди краще. Перестаравшись, ви можете отримати негнучкий результат, який не впорається зі змінами в вимогах. Щоб впоратися зі зміною, ви не тільки повинні змінити клас, який потребує обробки цих змін, але ви також повинні створити спосіб для того, щоб інформація, якої вона раніше не потребувала, була доступною, незважаючи на шари прихованості даних.

Проблема полягає в тому, що, як і у всіх проблемах пошуку правильного балансу для кожного контексту, він потребує досвіду.


7

Розкриття внутрішніх масивів

    public class Data {
    int[] x;

    public void setArray(int[] x) {

        this.x = x;
    }

    public int[] getArray() {

        return x;
    }
}

Відповідно до http://www.oracle.com/technetwork/java/seccodeguide-139067.html

копіюйте об'єкти, що змінюються, перед поверненням, за винятком випадків, коли має намір поділитися станом.


6

Стан, що змінюється, і петлі. Ви майже ніколи не потребуєте їх, і ви майже завжди отримуєте кращий код без них.

Наприклад, це взято безпосередньо з потоку StackOverflow:

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

Вони обидва роблять те саме. Але я поняття не маю, що вони роблять. На щастя, питання насправді пояснює, що вони роблять, тому я зміг їх переписати так:

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

Немає циклів і не змінюється стан. Ну добре, без явних циклів і без лічильників циклу.

Код став набагато коротшим, набагато простішим, набагато більше нагадує опис того, що повинен робити код (особливо у випадку Ruby, він майже прямо говорить «згрупуйте речі за типом»), і набагато менше схильний до помилок. Немає небезпеки вибігати з кінця масиву, помилок стовпчиків або помилок одноосібно з індексами циклу та умовами завершення, оскільки немає індексів циклу та умов припинення.


Я вважаю, що у другому рядку вашого "виправленого" ECMAScript слід прочитати (acc[thing.type] || (acc[thing.type] = [])), на відміну від "= [речі]" , unless you want to add в списку двічі ... Або я щось пропускаю?
Остін Гайд

@Austin Hyde: Ти маєш рацію.
Йорг W Міттаг

1
Цей приклад ecmascript незрозумілий для багатьох програмістів. Він спирається на занадто багато синтаксичних хитрощів. Цикл має перевагу очевидності для молодших розробників.
Joeri Sebrechts

6

Знущаються. Це вводить занадто багато штучних вимог до надмірної розв'язки у вашому коді, призводить до перенапруженого коду равіолі та змушує дизайн у стилі OO за горло, коли більш процедурна чи функціональна конструкція може бути більш простим рішенням вашої проблеми.


Погоджено теоретично; макети корисні, але їх не потрібно мати.
Уейн Моліна

Інвазивність глузування залежить від мови, якою ви користуєтесь. У C # він може бути дуже інвазивним і додає плоти непотрібних інтерфейсів.
Френк Хілеман

3

Програмісти Delphi у всьому світі з'ясовували протягом останніх двох років, як погано використовувати масиви символів для зберігання байтів через перетворення Unicode у вільний масштаб

І, «незабаром» ми дізнаємось, як погано зберігати цілі числа у списках, коли ми хочемо внести зміни до 64-розрядних.


2
Я думаю, що величезна частина питань Unicode ніколи не виникне, якби Borland оголосив тип DataString, який був в основному таким же, як AnsiString, але спеціально для використання з крабами, а потім переконався, що люди про це знають.
Мейсон Уілер

2

Властивості. Я знаю, що це суперечливо, але я вважаю, що властивості в мережі .net надзвичайно використовуються.

Яка різниця між цими двома рядками?

public string Property { get; set; }

public string Field;

Для розробника різниця така: абсолютно нічого. Скомпільована форма є дещо іншою, тому якщо ви пишете бібліотеку, і ця бібліотека буде модернізована в програмах, і ви не можете перекомпілювати самі програми (наприклад, якщо ви пишете інтерфейс для плагінів, має працювати в різних версіях вашого програмного забезпечення), тоді ви не повинні використовувати загальнодоступні поля, оскільки ви не можете замінити їх властивостями. У будь-якому іншому випадку абсолютно не існує різниці між використанням поля або автовластивості без модифікаторів.


1
Домовились; якщо ви знаєте 100%, вам ніколи не доведеться нічого робити з отриманням / встановленням "власності", тоді немає жодної причини мати майно. Однак, якщо є шанс, вам потрібно буде щось зробити (наприклад, записати, що значення було змінено, наприклад), вам слід використовувати властивість. Особисто я не бачу досить великої різниці , щоб НЕ використовувати властивість, тільки в разі , якщо ви робите необхідність змінити його пізніше (я знаю, я знаю , YAGNIале я відчуваю , відхиляючись в цьому випадку не варто нічого)
Уейн Molina

2
@Wayne: Як змінюється ;на { get { ... } set { ... } }будь-який більше роботи , ніж зміни { get; set; }в { get { ... } set { ... } }?
конфігуратор

Тепер, коли я думаю про це, це справедливий момент.
Уейн Моліна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.