Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
auto data = std::unique_ptr<MyClass>(new MyClass);
...
if (FAILED(hr))
return hr;
...
return S_OK;
if (FAILED(..)) return и это считается нормальной практикой.new MyClass? Можно, конечно, нагородить фабрики, но они-то все равно в итоге будут звать конструктор, у которого нет возможности вернуть ошибку вместо объекта.On their face, the benefits of using exceptions outweigh the costs, especially in new projects. However, for existing code, the introduction of exceptions has implications on all dependent code. If exceptions can be propagated beyond a new project, it also becomes problematic to integrate the new project into existing exception-free code. Because most existing C++ code at Google is not prepared to deal with exceptions, it is comparatively difficult to adopt new code that generates exceptions.
С кодом ошибки всё ясно — если функция его возвращает — его надо сразу получить и обработать. Какие ещё варианты?* Заб
«А может пробросить его наверх и обработать там?»А кодом ошибки такого уже не бывает что ли?
int SomeFunc(); нужно ну очень постараться, чтобы не заметить слово int и не поинтересоваться, а что же оно означает. if (!SomeFunc()) {
return SOME_ERROR;
}
if (!SomeOtherFunc()) {
return SOME_OTHER_ERROR;
}
...
if (foo() && bar()) становится невозможно писать — ведь там тоже могут быть ошибки, и их надо проверять. И в коде получается больше половины рутинного, повторяющегося мусора, который ничего не делает, кроме проверки ошибки и её пробрасывания выше (потому что в 90% случаев — таки да, ошибки обрабатываются на несколько уровней выше, чем они возникают — потому что тот код, в котором вылезает, скажем, ошибка чтения файла, понятия не имеет о том, в какой высокоуровневой операции он участвует, и как её корректно откатить, например).Полноценная поддержка Android *
Полноценная поддержка iOS *
на Qt DevDays '13 Ларс обещал поддерку Windows Mobile в Qt 5.3.
Пройдет немного времени и нативщики будут попросту не нужны. Какой смысл держать пять разработчиков для пяти разных платформ, если можно держать одного джедая Qt, который будет все компилить под нужный target в мгновение ока
UI — оно и так нативное. Qt построен так, что в момент разработки мы оперируем с достаточно высоким уровнем элементов интерфейса, это позволяет собрать его под конкретную платформу с учетом всех гайдлайнов
Занекропощу:
требуют по оконному хэндлу на виджет, они не умеют по-другому.
на этом был основан один способ крушения Win95/98, когда зловред просто начинал с дикой скоростью создавать окна (в глобальном смысле слова, а не в смысле диалогового окна), добиралось это дело до 65535 или около того и система радостно уходила в BSOD.
на много порядков быстрее
На C++ я разрабатываю приложения на много порядков быстрее
- Минимум дополнительных строк: переменные надо либо просто объявить без указания типа (JavaScript), либо вообще объявлять не нужно (отдельные диалекты Бейсика[1]) или не обязательно (PHP).
- Соответственно, упрощается написание простых программ.
- Повышается гибкость языка. Например, только динамический язык может иметь функцию
eval(), вычисляющую значение произвольного выражения.- Ускоряет работу компилятора — а значит, производственный цикл «написать-проверить».
- Автоматически даёт языку элементы метапрограммирования и интроспекции.
- Другими словами: когда программист пишет функцию «отсортировать массив», функция сразу начинает работать для массива чисел, массива строк, массива объектов (метапрограммирование). Чтобы определить, возможна ли операция
x.length, среде выполнения нужно знать, какого типа переменнаяxи есть ли у неё полеlength; если подобные запросы может делать и сама программа, это и есть интроспекция.
- Упрощается работа прикладного программиста с СУБД, которые принципиально возвращают информацию в «динамически типизированном» виде. Поэтому динамические языки ценны, например, для программирования веб-служб.
- Иногда требуется работать с данными переменного типа. Например, функция поиска подстроки возвращает позицию найденного символа (число) или маркер «не найдено». В PHP этот маркер — булевское
false. В статических языках это особая константа (0 в Паскале,std::string::nposв C++).
scala> "zxc".indexOf("a") res0: Int = -1
сайты сейчас делают в основном на динамически типизированных языках
Зато в пыхе я должено постоянно писать МИЛЛИОНЫ ====== чтоб уж ТОЧНО быть уверенным, что там false, а не 0.
Что там кстати с метапрограммированием?
Как насчёт вызова метода по строке с именем
добавления метода в существующий объект
Все на этапе компиляции.
a.myMethod(b) не проверяя есть ли `myMethod` у `a` и при этом сам `a` отреагирует на это в зависимости от внутреннего состояние. Но этим обычно не пользуются. Это и в C# есть, кстати.a."method_$name"(b) над a(s"method_$name")(b)? В одном символе?> В scala можно скомпилировать a.myMethod(b)
Если же вы про совсем крайний случай, то в чем преимущество у a.«method_$name»(b) над a(s«method_$name»)(b)? В одном символе?
a["method_" + name](b), у него есть аналог в Scala? Вот это я хочу понять, потому что это наверное самая частоиспользуемая мной конструкция из метапрограммирования.val map = Map(
"method_plus_2" -> { (_: Int) + 2 },
"method_multiply_2" -> { (_: Int) * 2 }
)
val name = if (true) "plus_2" else "multiply_2"
map(s"method_$name")(3)
// res0: Int = 5
def wrap(a: Any) = new {
def apply(name: String)(x: Object*) =
a.getClass.getMethods.filter(_.getName == name).head.invoke(a, x:_*)
}
class Test{ def method_concat(s1: String, s2: String) = s1 + s2 }
val a = wrap(new Test)
val name = "concat"
a(s"method_$name")("A", "B")
// Object = AB
Как-бы а чем вас мап не устраивает?
А чем второй случай не устраивает?
Вы объясните зачем вам это может понадобиться
В джаваскрипте или руби этот врап не нужен, просто обращаетесь к любому методу по имени.
Есть контроллер, у которого на роуты замаплены методы
path( "something" / Segment ) {
case "show" => SomethingController.show
...
case _ => // 404
}
path( "something" / Segment ) {
SomethingController.allMethods orElse {_ => /*404*/}
}
allMethods(SomethingController) — дело вкуса. В остальных scala web-фреймворках разруливается подобным образом.Ну как бы не впечатлило оба раза.
У вас претензии, кажется, не столько к динамической типизации, сколько к слабой
Ну и метапрограммирование в динамических языках все-таки на порядки мощнее, чем в Scala, и даже в D.
sql"select id from members where name = ${name}"
xml \\ xp"*[@attr = $name ]" // здесь нет конкатенации, это XPath с внешней переменной
// здесь конкатенация просто невозможна - это XPath с внешней функцией
xml \\ xp"*[$isAllowedAttributeOrText(@attr, text())]"
Таки к динамической. В свое время я тоже намучался от того, что в метод мой передавали объект другого типа с теми же методами
Так может говорить только тот, кто не пробовал. Изменения в рантайме — жуткая не тестируемая лапша. Жизнь на бомбе. Как вы правильно заметили это не используется.
Ну и да, в JS, Ruby и других просто нет тех же инструментов метапрограммирования. Элементарный пример: как вы на этих языках реалиуете что-то вроде scalikejdbc:
sql"select id from members where name = ${name}"
Абсолютно такую же ситуацию можно получить в языке со статической но структурной типизацией — например, Objective Caml.
В смысле, чтобы name брался из текущей области видимости?
А по поводу памяти: если сохранять инкапсуляцию и придерживаться правила «написал код выделения памяти — сразу же напиши код для ее освобождения»
Я три с половиной года писал на AS3, PHP и Python. Достаточно динамические языки для вас?
При этом, как показали эксперименты, профессионал C++ и профессионал Java пишут приложения с одинаковой скоростью.
struct Foo {
void DoBar(Bar* b);
};
struct Bar {
void DoFoo(Foo* f);
};
void Foo::DoBar(Bar* b) {
b->DoFoo(this);
}
void Bar::DoFoo(Foo* f) {
f->DoBar(this);
}
class Foo {
public void DoBar(Bar b) { b.DoFoo(this); }
}
class Bar {
public void DoFoo(Foo f) { f.DoBar(this); }
}
Приведите примеры превосходства динамической типизации перед статической?
сохранять инкапсуляцию и придерживаться правила «написал код выделения памяти — сразу же напиши код для ее освобождения»
Минус — разработка занимает значительно больше времени, чем на языках с динамической типизацией.
отрисовка текста в Qt собственная и сильно отличается от Core Text, что делает приложения чужеродными. А текст — это один из основных элементов интерфейса.
Qt 5.2.0 вышел в свет!