?

Log in

Белые слова [KAPACb] [ДАЖДЬ] [Анти-Синтон] [Фото] [TheQuestion] [DomEconom] [Ticketland] [ВКонтакте] [FaceBook] [Спрашивалка] Below are the 10 most recent journal entries recorded in the "Сервер не найден" journal:

[<< Previous 10 entries]

July 23rd, 2017
12:24 am

[Link]

Несколько мыслей о выразительности
1. Симметрия (и ритм как переносная симметрия), да и всё прямое и ровненькое, радуют глаз и восхищают во всём, кроме программного кода. Повторяемость конструкций вызывает подозрение, что какие-то из них лишние и надо использовать одну за всех.

2. Выразительность в программировании делится на "ясно, зачем это" и "ясно, как". Крайний пример второго - язык ассемблера, где каждая строчка делает понятно что, но в реальной программе теряется в дебрях структуры (а всё выглядит ровненько-ровненько, см. п.1). Крайний пример первого - почему-то тестовые библиотеки, такие, как mockito и scalatest: конструции вида when(a.isCalled()).thenReturn(whatIsNeeded) выглядят почти как связный английский текст, но поди сразу пойми, какие методы каких классов тут вызываются и какие объекты выдают. К счастью, взаимоисключение неабсолютное, языки развиваются с улучшением обеих выразительностей. Но какой код легче переиспользовать? Если первый раз видишь и нет описаний, то легче выразительный "как": очень часто бывает, что скопируешь вроде как понятный выразительный "зачем" кусок, слегка переделаешь для новой задачи и потом долго тупишь - а почему он не работает. А вообще - конечно, он лучше.

3. Комментарии нужны не столько для того, чтобы описывать код (он сам должен быть выразительным), скорее они описывают, почему с кодом чего-то не сделано по-другому.

Tags: ,

(Leave a comment)

July 9th, 2017
10:04 pm

[Link]

Урбанистиха
в фейсбуке уже былоCollapse )

Tags:

(Leave a comment)

June 30th, 2017
01:44 pm

[Link]

Про рефакторинг
Что меня смущает в порядке рефакторинга, предложенном Фаулером:

1. Подход "сначала реализуй самым тупым способом, потом чисти код". Ну есть же принцип RefactorFirst. Рефакторинг для того и нужен, чтобы вносить изменения было проще - соответственно, вносить изменения надо тогда, когда система к этому готова. Можно, конечно, расчитывать на то, что код стал чистым после предыдущей итерации, но, во-первых, так не всегда получается, во-вторых, само понятие "чистоты кода" не абсолютно, а зависит от тех изменений, к которым код должен быть готов: соответственно, с появлением новых требований код может перестать быть "чистым" (а в коде, готовом к изменениям, которых не будет, может быть ради этих изменений много лишнего).

Автор, возможно, ничего такого и не имел в виду, но мне попадались крайне неудачные примеры.

2. Принцип "двух шляп" - или меняй функциональность, или делай рефакторинг. Пусть нас есть код, требующий и того, и другого. Если мы делаем с кодом что-то одно, мы накладываем на свою работу ненужные ограничения, и тем её усложняем. Или мы меняем функциональность, работая со старой неудобной структурой (см. пред. пункт), или мы меняем структуру, поддерживая старую, неправильную функциональность. На простых примерах это осмысленно, на сложных нет - приходится совмещать, хотя, конечно, это увеличивает количество изменений на одном шаге, что по-своему сложнее и, при недостаточно хорошем тестировании, более рискованно.

Tags:

(4 comments | Leave a comment)

June 7th, 2017
10:30 pm

[Link]

Вынь пробку!
Юность прошла, диплом не прёт, с работой, похоже, мрак,
Вокруг кто спит, кто верит, кто врёт, кто фашист, кто просто дурак.
Интеллигенции не привыкать – неважно, где и когда.
Вынь пробку! Вынь пробку, там – ерунда.

По цепи намёков найдёшь за углом средь чучел и света луны
То ли новый ООН за круглым столом, то ли сходку местной шпаны.
Ты плохо знаешь, чего хочешь сам, но вдруг есть у этих ребят?
Вынь пробку! Вынь пробку, тебе говорят!

Кандомбле, умбанда, слова, барабан, дым, всё, что хрен запретишь
Тебе информация, им пропаганда - ты хитрый, просто глядишь.
Но ты за столом, и карты в руках, скажешь, что ты не в игре?
Вынь пробку! Или пляши быстрей.

И ты получаешь последний фант, и что говорить о судьбе,
С глупой улыбкой везёшь чемодан, а там не твоё, не тебе.
А ты не стесняйся подумать: а что там? Вдруг там бомба иль яд?
Вынь пробку! Ещё не поздно назад!

Если долго смотреть на то, что висит, оно треснет тебя по лбу.
Если считать, что всё уже сыграно, кто тебе даст трубу?
Останется только встать в полный рост перед адским котлом, проорав:
- Вынь пробку! - И в этом ты будешь прав.

Tags:

(Leave a comment)

April 2nd, 2017
01:35 pm

[Link]

Типы и "происхождения" значений
Или вот ещё такой философский вопрос по стилю.

Можно написать так:

...
String name = foo.name;
method(name);
...
public void method(String fooName) {
  ...
}


А можно так:
...
method(foo);
...
public void method(Foo foo) {
  String  fooName = foo.name;
  ...  
}


Недостаток второго подхода в том, что метод method "слишком много знает" об объекте foo. Но зато:

  1. Мы на уровне компиляции уверены, что метод выполнится именно для Foo.name, а не какой-то другой строки;

  2. Если данные, хранящиеся в Foo.name будут храниться как-то по-другому - в двух отдельных полях Foo или вообще вне объекта - менять сигнатуру метода method не придётся.

Первого можно бы было избежать, если бы объекты/значения в языка маркировались бы не только типом, но и "происхождением". Радикальным вариантом было бы введение для каждого "происхождения" отдельного типа:
class FooName {  // жалко, что нельзя extends String
  public final String string;
  public FooName(String s) {
    this.string = s;
  }
}
...
class Foo {
  public final FooName fooName;
...
}
...
method(foo.name);
...
public void method(FooName holder) {
  String  fooName = holder.string;
  ...  
}


Но как-то нехорошо иметь слишком много классов. В каком-нибудь новом языке для этого есть синтаксический сахар?
И (2) это тоже не решает.

Tags:

(Leave a comment)

December 10th, 2016
08:12 pm

[Link]

ООП умирает

Три важных и хороших принципа объектно-ориентированного программирования гласят:


  1. Используйте полиморфизм вместо условий

  2. Разделяйте слои

  3. Не устраивайте параллельных иерархий

Реально воплощаемы только какие-то два принципа из трёх, оставшимся придётся поступиться. Вот традиционный пример:

if (a instanceof AClass) {
  doSomething(a);
} else if (a instanceof BClass){
  doSomethingElse(a);
}

Что нам советует классическоее ООП? Заменить условие полиморфизмом, засунув различное поведение внутрь классов:



a.doSomething();

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

commandMap.put(AClass, a -> doSomething(a));
commandMap.put(BClass, a -> doSomethingElse(a));
...
commandMap.get(a.getClass()).accept(a)

что, вообще говоря, уже дублирует иерархию, да и выглядит не сильно лучше исходного.

Объектно-ориентированное программирование умирает. За последние десять лет все просят - и получают - всякого перевоплощения и развития функционального программирования, будь то лямбда-исчисление, замыкания и цепочки фильтров, либо какого-нибудь "программирования, ориентированного на данные", а объектная ориентированность - уходит. Типичный веб-проект состоит из объектов модели, в которых весь функционал - геттеры и сеттеры, почти старые добрые записи из Паскаля, и нескольких слоёв репозиторий, сервисов, контроллеров, адаптеров, которые все stateless и по сути являются наборами функций.

Чуда не случилось. Пускай имеется в наличии компонента с открытым исходным кодом, которая ведёт себя почти так, как нам нужно, за исключением одной строчки - и не в методе, который мы вызываем, а где-нибудь в седьмом-десятом слое по глубине вызова. "Не надо переписывать, можно унаследовать"? ООП чуть ли не обещает нам это, но реально мы можем что-то такое сделать, только если создатели компоненты такое заранее предусмотрели; а если бы сам язык это предусматривал, это будет очень непохоже на "наследование" - это будет тот самый monkey patching со всеми его недостатками.

Что после всего этого будет - не знаю.

Tags:

(7 comments | Leave a comment)

September 28th, 2016
10:36 pm

[Link]

Недавно советские газеты опубликовали сенсационную новость: нарком юстиции N подписал обращение, призывающее прекратить политические репрессии! Хотя пресс-служба наркомата и сообщила, что нарком призывал только вывести репрессии из компетенции "троек" и вернуть рассмотрение дел в суды, на самом деле в тексте петиции  утверждалось, что репрессии - явление в целом пагубное и рано или поздно должны будут отменены полностью.

Мнение советского общества по этому вопросу разделилось. Одни люди говорят, что это ещё один признак того, что мы скатываемся в мрачные дореволюционные времена, и если сегодня отменят репрессии, завтра отменят уроки астрономии в школе, а то и само всеобщее образование. Другие считают, что репрессии явление вредное, однако наше общество пока не готово к их отмене. Простой гражданин, внезапно обнаруживший вредителя или врага народа, вместо того, чтобы анонимно обратиться в НКВД и быстро решить проблему, будет вынужден избавляться от него народными средствами, либо обращаться к нелегальным киллерам. Лежащие повсюду бесхозные трупы террористов и  шпионов вызовут новые вспышки инфекционных заболеваний. Или вы хотите, чтобы  мы дальше жили бок о бок с врагами, и кормили этих паразитов? Третьи убеждены, что государство отказом от массовых казней просто желает увеличить численность населения, которого можно сделать рабами на стройках каналов, что остаётся весьма сомнительной затеей, учитывая остающиеся проблемы колхозов - и существующих-то советских граждан кормить нечем.

Четвёртые, однако, напоминают, что товарищ N и его коллеги по наркомату всегда поддерживали мнение, что массовые внесудебные репрессии несовместимы с гуманизмом и социалистической справедливостью. (У некоторых на это есть возражение, что жизнь в лагерях ГУЛАГа или даже на воле в СССР, возможно, даже менее гуманные условия, чем смерть). Более того, репрессии отсуствуют в некоторых странах, о которых неоднократно писалось как о достигших даже большего прогресса в делах социалистического строительства!

Они нам, впрочем, не указ.

Tags:

(Leave a comment)

May 27th, 2016
03:17 pm

[Link]

У пиццерии
У пиццерии, говорят,
Стою я, сам себе не рад:
Где вся еда как на парад,
Сыры и злаки,
Я прежде вкуса узнаю
Всю ограниченность свою
И трепещу, как на краю,
И вижу знаки.

Да, я весь мир сажал на ось,
И пост, и пир прошёл насквозь,
И ни с какой мне не пришлось
Бороться «ломкой»,
Но стоит со стола сгрести
И крошки оглядеть в горсти,
То пробирает до кости,
Кривой и ломкой.

Ведь в чём вопрос? Я ел и рос,
То вверх, то вширь, то вкривь, то вкось,
Высок и толст, как тот даос,
Налился соком,
И нет вины мне в том, что сыт,
Что в рот войдёт, не осквернит,
Но то, что лишне – портит вид,
И вышло боком.

И глядя, вместо новых лиц,
В глаза маслин, в овалы пицц,
Деля улыбки продавщиц
На литры кружек,
Я понял на свою беду,
Что никуда я не уйду,
А если будут, приведу
Любовь и дружбу.

Ведь я скажу тебе «привет»,
Слегка польщу, вручу букет,
И что мне скажет этикет?
Сломать копилку,
Прийти сюда, присесть к огню,
Спросить «что хочешь?», дав меню,
И – пусть не тянет на фигню –
Взять в руки вилку.

Tags:

(6 comments | Leave a comment)

March 10th, 2016
03:01 pm

[Link]

За лытдыбром - в фейсбук.
https://www.facebook.com/konstkaras
Тут пока не знаю, что писать. Разве что серьёзное нечто, если произойдёт.

Ах да. Я участвовал во втором туре Московского конкурса авторской песни.

Tags: , ,

(Leave a comment)

January 11th, 2016
11:00 pm

[Link]

Афиша

Tags:

(1 comment | Leave a comment)

[<< Previous 10 entries]

KAPACb Powered by LiveJournal.com