Search
Write a publication
Pull to refresh
11
0

Lead Developer

Send message
Не подумайте, что я придираюсь, мне правда интересно (я понемногу изучаю верстку и программирование для веб):

Какие сегодня есть альтернативы jQuery? Почему он считается устаревшим?
Если не использовать jQuery, то не выйдет использовать и тот же Bootstrap, а какие ему сегодня есть популярные альтернативы?
Про выдержку на английском я тоже согласен, о чем и написал в конце предыдущего сообщения. «тупо массив» использовать не выйдет при неизвестном количестве элементов, и придется писать заново велосипед для расширения массива, который уже внутри ArrayList. Хотя в случае с забиванием null пожалуй соглашусь с вами, потери тут будут минимальны.

А вот по сложности алгоритмов — вы путаете произвольный доступ к случайному элементу и итерирование. Было бы странным при практически равных показателях на операции с чтением всех элементов иметь в одном случае o(n) а в другом o(1).

Также хотел бы ОБЯЗАТЕЛЬНО обратить внимание на пункт с последовательностью в памяти к элементам, что должно было бы упростить доступ к ним — в java в памяти последовательно лежит только массив указателей на указатели, сами же указатели на объекты и объекты будут непоследовательно лежать в памяти, в разных местах.
Вся проблема в оверхеде при аллокации памяти при изменении очередности элементов. В LinkedList этой проблемы нету.
Вы рассматриваете абстрактных коней в вакууме, а вам приводят объективные доводы в пользу той или иной структуры хранения данных.

Потому пройдемся по списку:

1) Пример надуман, да и не представляю что создать миллионный массив + 1000 быстрее, чем просто добавить 1000
2) Приведите пример? В чем сложность итерирования вообще чего либо?
3) Это заставит приложение разрастить просто нереально, о эффективном использовании памяти речь не будет идти вовсе. (Не забываем про аллокацию при достижении лимита выделенной памяти под массив)
4) Вода, нужен пруф и тесты
5) Снова вода и снова нужны пруф и тесты
6) Каждый элемент массива — указатель. Конечно памяти ест меньше, но ваше сравнение некорректное, ведь для каждой структуры свои цели — советую почитать что и где лучше использовать.
7) При добавлении неизвестного количества элементов LinkedList даст фору именно по этой причине.

Вы написал «пруфы смысла не имеют» — не надо так. Я сам использую почти всегда ArrayList, но лишь по той причине, что скорость работы и количество аллокаций мне не важны. В BigData разговор был бы совсем другой.
с помощью итератора (когда не нужно ходить по списку каждую итерацию для поиска последнего элемента) LinkedList быстрее.
пруф
Я писал в контексте
использовать локальные переменные вместо полей
Метод onDraw вызывается каждый кадр, потому будет нагрузка на GC.
Не везде это может оказаться полезным, как минимум в методе onDraw так делать не нужно.
Потому автор и написал, что не нужно изобретать велосипед, а использовать по возможности стандартные возможности.
Как раз говорить, как говорите вы, некорректно. Какие же это UI паттерны? Что значит граница приложения? Где можно почитать про то, что это всё вместе UI-паттерн?

Мне всегда казалось, что это архитектурные паттерны.
В MVC (к примеру) модель, UI и схема их взаимодействия разделены.
Основная цель применения этой концепции состоит в разделении бизнес-логики (модели) от её визуализации (представления, вида).
Т.е. они используются для грамотного разделения модели и UI, это очевидно.
Разделять приложение на слои (я даже не говорю про разделение на уровни в рамках одного слоя) и нужно, если следовать данным архитектурным паттернам.
qw1 дело говорит, UB тут не будет, хотя такой код я бы не писал. Инкременты, затем присваивание, так в Си (как минимум).
Вообще, эквивалентом будет такой код:
*a++ = *b++;
/////////////////////
int i = 0;
a[i] = b[i];
i++;
Анализаторы кода нужны практически везде (как и грамотное тестирование приложений).

Так как вы привели пример с картинками, я тоже приведу похожий.
В системе Android картинки (кроме формата png, bmp, jpg и т.д.) могут быть описаны файлом в формате xml.
Обычно иконку приложения описывают как именно картинку, и это не вызывало проблем. Но появился разработчик, который вместо png файла вставил xml файл. Очевидно, что все должно было работать, ведь система поддерживает данный формат. Оно и работало — на большинстве телефонов, кроме модели от Sony. У данной модели была своя реализация UI для телефона, которая не предусмотрела xml как входной формат. Телефон пытался отобразить картинку, у него не получалось, он перезагружался и цикл повторялся.

Статический анализатор вполне мог бы указать, что switch-case блоки для всех типов в enum, кроме xml.
Теперь я вас понял.
Поддержу вас в том, что для расширяемости приложения удобнее логику работы с ActionBar хранить в Activity (ну если только архитектура это позволяет, ведь какой-нибудь ToolBar может быть прямо внутри фрагмента, и стучать колбэками из Activity в него плохой стиль, имхо).
И все же не вижу существенной разницы в приведении типа между Object и IObject. Можете обосновать этот момент — почему это вам не нравится?
Что за глупости. Если я наверняка знаю, что все мои фрагменты лежат в BaseActivity, то всегда могу вызвать ее метод.
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    mActivityContract = (ActivityContract) activity;
}

Ваши слова себе же противоречат:
Сами фрагменты в onAttach регистрируют Activity как слушатель
Не понимаю, как будет реализована связка через слушателей без того же преобразования типов — приведите пример, пожалуйста.

Соглашусь в том, что Activity должен руководить изменениями в ActionBar, а не фрагмент, так как в таком случае проще будет добавлять поддержку планшетов и прочих модернизаций, касающихся функционала.
Мне статья понравилась, но есть замечание по терминологии в 1 пункте
Объекты содержат в себе статические поля и все методы. Экземпляры содержат только не статические поля. Это значит, что методы не дублируются в каждом экземпляре, и здесь применяется паттерн Flyweight.
Есть понятие («класс») и есть понятие («экземпляр класса», что по сути == «объект»). Используя такие термины, никогда не возникнет путаницы при изучении нового языка.

Также мне интересно, есть ли у разработчиков понимание, почему один и тот же метод у разных экземпляров класса в разных потоках не пересекается с другими и не меняет их значения, ведь по сути инструкции метода не дублируются?
Все встало на свои места — компилятор не будет резервировать место под ссылку, если она в теле метода создается и больше не используется нигде. TEST
Если же ссылка будет полем объекта или пробрасываться в параметр методу — 4(8) байта.
Теперь зададим Toolbar, как ActioanBar, это обеспечит нам обратную совместимость с предыдущими версиями Android (API Level < 21).
Это не так, Toolbar будет работать с любой версией андроида. Запихивать его в Actionbar нужно тогда, когда разработчик ленится переносить логику по работе с Actionbar в новый API, или когда проект имеет много скринов и переход будет трудозатратен.
По новым гайдам NavigationDrawer закрывает Header, потому нету смысла более иметь ActionBarDrawerToggle — обходитесь без него.
В С++ давно уже есть умные указатели, которые позволяют свести работу со звездочкой к минимуму.
По сути, в ios пошли таким же путем, хотя это и С.
Если мы создадим ссылку в теле метода, то эта ссылка будет лишь алиасом. К сожалению, на практике, как я написал ответом чуть выше — это не так, потому я был очень удивлен.
Я понимаю, что вполне себе логично не хранить ссылку вообще в ассемблерном коде, а просто ссылаться на адрес переменной по этой ссылке (в теле метода, не в объекте — по поводу объекта и при передаче как параметра я с вами согласен).

A C++ reference is not a pointer. It is an alias of an object. Sometimes, the compiler chooses to implement this by using a pointer. But often, it implements it by doing nothing at all. By simply generate code which refers directly to the original object.
Не могу понять, почему спецификация говорит о том, что ссылки могут не занимать памяти.
Простой пример покажет вот такой результат:
long long int a = 5;
long long int &ref = a;

printf("%d = a\n",  sizeof(a));
printf("%d = ref\n",  sizeof(ref));
printf("%d = &ref\n",  sizeof(&ref));

//... output
8 = a
8 = ref
4 = &ref
Вообще-то написано в корне не так. По ссылке из предыдущего вашего сообщения я вижу, что она занимает место в памяти и пример кода, который по сути говорит, сколько в памяти занимает объект, на который ссылка и ссылается (в спецификации и в моем сообщении об этом написано, и есть разъяснение, почему так, а именно ссылка может не занимать места в памяти).
На всякий случай, я говорю про этот код от вас:
struct Foo
{
	Foo(int& some) : a(some), b(some) { }
	int &a;
	int &b;
};

int main() {
	std::cout << "Expecting 1 if reference has no size and 8 if it has" << std::endl << sizeof(Foo) << std::endl;
	return 0;
}

Про спецификацию тоже не вижу ничего ( как минимум до того момента, как я на нее сослался)

Мы не знаем механизма реализации, особенно на уровне спецификаций и как следствие программирования, а специфигация гласит, что ссылка скорее всего не будет иметь адреса (т.е места хранения) и говорит рассчитывать разработчику на это. Прочитайте мои предыдущие сообщения, я могу перевести вырезки из спецификации, если вы не поняли сути. Именно по этой причине мы не можем взять у ссылки ее адрес (по факту мы берем лишь адрес переменной, на которую она ссылается). Потому считаю некорректным высказывание «чаще всего это указатели». Ссылка это или ничего, или черный ящик.
Через new мы получаем ссылку на объект, который находится в куче (если new не переопределен извращенцем).
Т.е. создавая указатель через этот оператор, 4(8) байта, которые нужны указателю для хранения значения, будут получены из стэка, но место для самого объекта, на который мы ссылаемся, будет в куче.
С инициализацией массива тоже самое — если вы используете new, то будет выделено место в куче под нужное количество элементов, указатель будет ссылаться на этот адрес, но сам же указатель будет находиться в стэке. Если же new при создании массива не используется, то весь массив будет создан в куче.
Пример кода и его output для понимания того, о чем я написал
int main() {
    int a = 5;
    int *p = new int[10000];
    printf("&a = %p\n", &a);
    printf("&p = %p\n", &p);
    printf("p = %p\n", p);
    delete[] p;
    return 0;
}
/// ... output
&a = 0xbfb7e6f8 // стэк
&p = 0xbfb7e6fc // стэк, в нем хранится 4 байта на любой участок памяти в куче
 p = 0x8887008 // куча, указатель ссылается на этот адрес

Information

Rating
Does not participate
Registered
Activity