Если я меняю фильтр, и снова нажимаю Показать, то сортировка сбрасывается. Было бы не плохо, если бы она сохранялась и сортировать можно было бы по нескольким колонкам. При этом по некоторым колонкам, как опцию хотелось бы сортировать по группам. Например не по точному значению люмен, а по округлённому до 200 значению, т.е. 1200, 1000, 800, 600, 400, 200, <200. И тоже самое по CRI 95+, 90, 85, 80 и т.д. тогда отсортировав такм образом по люменам или по CRI, вторым уровнем я бы отсортировал, например, по цене. Потому, что я не выбиру лампочку на 1 lm ярче, если она в два раза дороже, а с точной сортировкой такие анализы делать невозможно. Хотя я, наверное, скачаю csv, если озадачусь таким сопоставлением, и сделаю в экселе всё, что захочу. Кстати, почему бы xslx не выложить для нормальных людей, а не только csv, для таких гиков, как я?
Но вообще, я на ваш сайт заглядываю, где-то раз в пол года только для того, чтобы убедиться, что всё ещё ничего не изобрели принципиально лучше Икеи по соотношению грамм/градусlm/Вт/рубль в тёплом цвете.
При клике на колонку первый раз сортировка всегда идёт по возрастанию. Для многих колонок логичнее сделать первой сортировку по убыванию. Вряд ли больше людей интересуется в первую очередь лампами с наименьшим CRI или с самой плохой оценкой, чем тех, которые ищут хорошие лампы. Поэтому абсолютно все, кому нужна сортировка по таким колонкам вынуждены кликать дважды, чтобы получить логичное направление.
Заглянул на сайт. Адское количество чекбоксов. Вместо этого должны быть нажимабельные иконки с типами патронов и два параметра: цветовая температура (тёплый/дневной/холодный) и матовая/прозрачная. Всё остальное в раскрывающейся секции «больше параметров». По дефолту должны быть отмечены E27 тёплый матовый. Сортировка по люменам по убыванию, потом по общей оценке. Это то, что нужно 90% зашедших (возражение принимается только в виде реальной статистики, какой фильтр и какую сортировку чаще всего используют пользователи на вашем сайте). При этом температуру и матовость тоже иконками сделать нужно.
Иконки — это я обобщённо говорю, скорее это могут быть миниатюрки 64x64 реальных фоток самых характерных образцов соответствующих ламп с удалёнными признаками конкретного производителя. Выделение можно сделать цветностью. Сначала все картики цветные т.е. выбрано всё. Если одну нажимаем, она остаётся цветной, остальные в этой группе уходят в ч/б. Дальше можно кликать ещё и они будут обратно цветнеть. Если отчекать последнюю, то все снова станут цветными т.к. если ничего не выбрано, то это значит филтр не применяется, что эквивалентно тому, что выбраны все, как оно сейчас и работает.
Не смог сам догадаться, что значат колонки пул, ВИ и акт, пока не сходил в расшифровку. Возможно там есть тултип но на сенсорном экране его не вызвать. Ссылка на расшифровку есть на первой странице, но там нет таблицы с результатом. Если перейти к результатам поиска, то уже нет ссылки на расшифровку колонок, нужно возвращаться на первую.
Не понятно как отсортирована таблица по умолчанию. Пока не кликнешь на одну из колонок, ни у одной колонки нет стрелки сортировки.
Не уверен, что по умолчанию стоит показывать неактуальные лампы. Я перед выходом в магазин открываю ваш сайт, выбираю патрон (E27), цвет (тёплый) и вариант колбы (матовый), и нажимая поиск ожидаю, что я возьму из них топ 10 и пойду их искать на прилавках. А вместо этого я вижу, что 50% топовых ламп уже не продаётся. Я расстраиваюсь. Вот были они такие хорошие лампы, но всё, я их уже не могу купить…
А как задаются эти эталонные цвета? На солнечном свете один и тот же цвет можно передать разными способами, тут же всё дело в форме спектра отражения. Т.е. если я скажу, что эталонный цвет это RGB(192, 96, 96), то это может оказаться как предмет переизлучающий спектр состоящий из трёх тонких линий, так и переизлучающий непрерывный спектр с горбом в красной области. Причём первый вариант может как выглядеть идеально в освещении трёх лазеров (CRI ≈ 0), так и казаться практически чёрным, если линии спектра не совпадают. А ещё на солнце что-то может давать люминисценцию от ультрафиолета…
Монитор — это деталь PC. Ноутбуки победили PC, планшеты и смартфоны победили ноутбуки. Поэтому мониторы дешевеют как отмирающая технология. Они нужны только в офисе и геймерам. Причём геймеры тоже переезжают на телевизоры. Надо сравнивать топовые мониторы и топовые телевизоры. Стоимость телевизоров сейчас, по моему, не имеет предела.
Этот инструмент часто противопоставляется болгарке, так вот хотел замолвить пару слов за болгарку. Я для себя открыл, что болгарка является самым точным и быстрым инструментом по работе с пластиком. Именно там, где мультитул только вызывает вибрацию из-за мягкости. Берём отрезной диск по металлу и спокойно режем точно в размер серые канализационные трубы, плинтус для ванной, обычный плинтус и т.п. Материалы делятся на два класса: те, что просто испепеляются — с ними можно работать абсолютно без сопротивления, как будто у вас в руках аннигилятор материи, и те, что лохматятся, но всё-равно пилятся очень легко. Разлохмаченность удаляется ножом за одну секунду. До того, как я открыл этот способ я использовал для пластика либо нож, либо ножовку по металлу. Но, канализационные трубы оказались слишком прочные для ножа и слишком трудоёмкие для ножовки. А плинтус обычно слишком фигурный, чтобы его уложить ровно и отрезать или отпилить без ёрзания. Болгарка режет без усилия, поэтому материал легко удержать ровно.
Мне кажется, автор статьи тоже это неявно предполагает. В большинстве языков, где это не так, наследование не поддерживается языком напрямую и его приходится эмулировать разными средствами.
Публичный контракт, в целом, должен передаваться именованием членов. С интерфейсом приходится верить на слово (и надеяться, что имплементор не забыл обеспечить выполнение всех правил, которые неявно следуют из смысла интерфейса), с абстрактным классом, на практике, гораздо больше уверенности, что всё, что неявно предполагается, действительно выполняется.
На практике нельзя обойтись одними интерфейсами. Идеальный интерфейс состоит из одного метода. Если методов больше, то голый интерфейс не выражает отношений между этими методами. Взять хотя бы ICollection из C#: сам интерфейс не гарантирует, что если мы вызвали Add(), то Count изменился на единицу или, что Contains() найдёт добавленный элемент. Автогенерённая имплементация со всеми throw new NotImplementedException() уже удовлетворяет интерфейсу и до рантайма никаких ошибок не обнаружится.
Так мы приходим к Контрактам. Для. Net есть Code Contracts. Интерфейс и контракты — это уже лучше, чем просто интерфейс, но Контракты заставляют всех имплементаторов повторять часть кода, которая отвечает за поддержание контракта.
Тогда становится логичным вместо интерфейса дать абстрактный класс, который гарантирует выполнение контракта, где вся изменяемая часть представлена protected abstract методами, а все остальные методы sealed. Можно и интерфейс оставить, для тех, кому абстрактный класс жмёт, но в 99% случаев можно обойтись классом, а не интерфейсом, если это не так, то абстрактный класс просто плохо сделан.
И так, по скольку у нас есть абстактный класс, который энфорсит выполнение контракта, то сам контракт уже не так нужен. По крайней мере врядли вы заморочитесь их использовать в рабочем проекте. Большинство enterprise проектов даже проверкой входных параметров в методах не заморачиваются, а контракты требуют в 10 раз большей прилежности для полного покрытия и поддержания в актуальном состоянии.
Таким образом, на практике, я рекомендую абстрактные классы с только sealed и abstract методами и интерфейсы с одним методом.
В ситуации, когда вам нужно и иметь несколько методов и наследовать несколько таких штук одновременно, то вместо интерфейсов с несколькими методами можно по прежнему использовать абстрактные классы, а в интерфейсах выразить композицию, т.е. каждый исходный интерфейс с несколькими методами превращается в интерфейс с одним readonly property абстрактного класса, в который мы переносим эти методы.
При наследовании интерфейсы, в большинстве случаев, выражают всякие ability (и, зачастую, имеют суффикс able, e.g. IDrawable, IEquatable), а абстрактные классы определяют существо объекта, его реальную принадлежность к категории объектов. Интерфейс с этим не справляется т.к. если мы не обвяжем его контрактами он не гарантирует, что наследник обладает нужным поведением.
Собственно это всё было к пункту 2:
Наследование от обычных классов (имеющих реализацию) — чрезвычайно специфический и крайне опасный архаизм.
Все пункты в теоретическом решении, кроме пятого, верны, но на практике, вместо пункта 2, соблюдайте open-closed principle и тогда вам нечего боятся наследования от абстрактного класса, который содержит реализацию, отвечающую, за выполнение того, что мы априори ожидаем от этого объекта. Это зачастую лучше голого интерфейса т.к. он не гарантирует отношений между своими членами и все наследники должны повторять этот код с нуля.
Я думаю можно размагнитить всё, кроме первого сантиметра магнитной полоски. Где-то на Хабре была статья про устройство банковских карт. Там на магнитной полосе около пяти дорожек (как на аудио кассете: две стороны умноженные на две дорожки для стерео). Одна дорожка банковская, другие что-то типа для таксофонов, для СКУД, для любой лабуды, типа скидочных карт и т.п. Каждая дорожка имеет в начале сигнатуру её типа. Я сам сталкивался с тем, что, если банкомат не может прочитать магнитную полоску, то карточка не засовывается дальше середины. Возможно вы с этим сталкивались, если пытались вставиьь карточку не тем концом. Это достоверно подтверждает, что ему для проверки достаточно только начала полоски.
Ситигид такое говорит: через 150 метров поверните налево, после моста. Т.е. я проезжаю под железнодорожным мостом и сразу поворачиваю налево.
Наверное у вас после Яндекс-навигатора сложилось впечатление, что такое невозможно.
Поздравляю! Вы только что изобрели ботокс. Он так и работает: ядом убивают некоторые нервы. Мышцы перестают сокращаться в ответ на эмоции, морщины разглаживаются.
Фотонам не нужно лететь назад, летящий позади сам их догонит. Вы же можете слышать сидящего впереди вас пассажира в самолёте, летящем со сверхзвуковой скоростью.
Не надо разводить Вавилон. IDE должна быть на английском. Кому хочется на русском, пускай и пишет на 1С. Всё-равно потом любая сложность на Stackoverflow приводить будет, так что лучше сразу разрушать языковой барьер. Проще сразу запомнить, что делают кнопки с непонятными международными названиями, чем сначала учить, что делают кнопки с непонятными русскими названиями, а потом взрывать себе мозг маппингом одних названий на другие.
Всё-равно практически сразу при переходе от хобби к профессиональной деятельности практически гарантированно столкнёшься с англоязычным интерфейсом, иностранным заказчиком и интернациональной коммандой.
Но вообще, я на ваш сайт заглядываю, где-то раз в пол года только для того, чтобы убедиться, что всё ещё ничего не изобрели принципиально лучше Икеи по соотношению
грамм/градусlm/Вт/рубль в тёплом цвете.Иконки — это я обобщённо говорю, скорее это могут быть миниатюрки 64x64 реальных фоток самых характерных образцов соответствующих ламп с удалёнными признаками конкретного производителя. Выделение можно сделать цветностью. Сначала все картики цветные т.е. выбрано всё. Если одну нажимаем, она остаётся цветной, остальные в этой группе уходят в ч/б. Дальше можно кликать ещё и они будут обратно цветнеть. Если отчекать последнюю, то все снова станут цветными т.к. если ничего не выбрано, то это значит филтр не применяется, что эквивалентно тому, что выбраны все, как оно сейчас и работает.
Не смог сам догадаться, что значат колонки пул, ВИ и акт, пока не сходил в расшифровку. Возможно там есть тултип но на сенсорном экране его не вызвать. Ссылка на расшифровку есть на первой странице, но там нет таблицы с результатом. Если перейти к результатам поиска, то уже нет ссылки на расшифровку колонок, нужно возвращаться на первую.
Не понятно как отсортирована таблица по умолчанию. Пока не кликнешь на одну из колонок, ни у одной колонки нет стрелки сортировки.
Не уверен, что по умолчанию стоит показывать неактуальные лампы. Я перед выходом в магазин открываю ваш сайт, выбираю патрон (E27), цвет (тёплый) и вариант колбы (матовый), и нажимая поиск ожидаю, что я возьму из них топ 10 и пойду их искать на прилавках. А вместо этого я вижу, что 50% топовых ламп уже не продаётся. Я расстраиваюсь. Вот были они такие хорошие лампы, но всё, я их уже не могу купить…
Если вы знаете китайский магазин, где можно верить написанному, пожалуйста поделитесь!
Публичный контракт, в целом, должен передаваться именованием членов. С интерфейсом приходится верить на слово (и надеяться, что имплементор не забыл обеспечить выполнение всех правил, которые неявно следуют из смысла интерфейса), с абстрактным классом, на практике, гораздо больше уверенности, что всё, что неявно предполагается, действительно выполняется.
Так мы приходим к Контрактам. Для. Net есть Code Contracts. Интерфейс и контракты — это уже лучше, чем просто интерфейс, но Контракты заставляют всех имплементаторов повторять часть кода, которая отвечает за поддержание контракта.
Тогда становится логичным вместо интерфейса дать абстрактный класс, который гарантирует выполнение контракта, где вся изменяемая часть представлена protected abstract методами, а все остальные методы sealed. Можно и интерфейс оставить, для тех, кому абстрактный класс жмёт, но в 99% случаев можно обойтись классом, а не интерфейсом, если это не так, то абстрактный класс просто плохо сделан.
И так, по скольку у нас есть абстактный класс, который энфорсит выполнение контракта, то сам контракт уже не так нужен. По крайней мере врядли вы заморочитесь их использовать в рабочем проекте. Большинство enterprise проектов даже проверкой входных параметров в методах не заморачиваются, а контракты требуют в 10 раз большей прилежности для полного покрытия и поддержания в актуальном состоянии.
Таким образом, на практике, я рекомендую абстрактные классы с только sealed и abstract методами и интерфейсы с одним методом.
В ситуации, когда вам нужно и иметь несколько методов и наследовать несколько таких штук одновременно, то вместо интерфейсов с несколькими методами можно по прежнему использовать абстрактные классы, а в интерфейсах выразить композицию, т.е. каждый исходный интерфейс с несколькими методами превращается в интерфейс с одним readonly property абстрактного класса, в который мы переносим эти методы.
При наследовании интерфейсы, в большинстве случаев, выражают всякие ability (и, зачастую, имеют суффикс able, e.g. IDrawable, IEquatable), а абстрактные классы определяют существо объекта, его реальную принадлежность к категории объектов. Интерфейс с этим не справляется т.к. если мы не обвяжем его контрактами он не гарантирует, что наследник обладает нужным поведением.
Собственно это всё было к пункту 2:
Все пункты в теоретическом решении, кроме пятого, верны, но на практике, вместо пункта 2, соблюдайте open-closed principle и тогда вам нечего боятся наследования от абстрактного класса, который содержит реализацию, отвечающую, за выполнение того, что мы априори ожидаем от этого объекта. Это зачастую лучше голого интерфейса т.к. он не гарантирует отношений между своими членами и все наследники должны повторять этот код с нуля.
Наверное у вас после Яндекс-навигатора сложилось впечатление, что такое невозможно.
Всё-равно практически сразу при переходе от хобби к профессиональной деятельности практически гарантированно столкнёшься с англоязычным интерфейсом, иностранным заказчиком и интернациональной коммандой.