И это очень плохая реализация. Фактически, желающий работать таксистом просто платит N рублей за бумажку. Государство получает N рублей ни за что — просто за то, что человек хочет работать. Смысл лицензий — недопустить предоставление некачественного сервиса. Лицензии должно быть тяжело получить и легко потерять.
Я же писал в контекте того, что государство не одобряет, когда обычные люди подрабатывают, минуя контроль со стороны государства. А P2P сервисы, в первую очередь, именно это и предлагают.
Нет, vtable, естественно, используются, без них никуда. Разница же такая:
1. Разная стратегия использования при наследовании. Если вы хотите иметь возможность перезаписать метод в классе-потомке, то делаете его виртуальным и оставляете открытым. При этом любой вызов открытых виртуальных методов будет осуществляться через vtable.
Методы интерфейса же являются автоматически virtual и sealed. Если хотите перезаписать метод интерфейса, то просто наследуете его второй раз, при этом старые методы будут неявно объявлены во второй раз. Это приводит к тому, что при вызове метода компилятор генерит оптимальный код, а не лезет в vtable.
Единственный подвох такого подхода: если преобразовать класс к базовому, а потом к интерфейсу, то будет использоваться интерфейс от базового класса. Но на практике я с таким не сталкивался.
2. Огромная разница в потреблении памяти. В C++ создаётся по отдельному полю vtable для каждого из множественно наследуемых классов, дополнительная память тратится на разруливание виртуального наследования. В C# информация о множественном наследовании сидит в единственном vtable на каждый объект в виде ссылок на vtable интерфейсов.
Обычно такая двойная адресация не вызывает проблем, т.к. выполняется только один раз. Единственное исключение: generic-методы с interface constraint, где двойная адресация происходит при каждом вызове интерфейсного метода.
В C++ же такое сделать попросту невозможно, т.к. объекты при множественном наследовании не могут располагаться по одному адресу. Из-за этого для каждого из базовых классов и приходится заводить по vtable.
P.S. Подумал — а ведь если это развить, то на отдельную публикацию пойдёт, надо бы заняться. Реально куча интересных нюансов вылезает.
> Я против того что мало зарабатывающие получают пенсию за мои деньги, вот этом мне не нравится
Задача государства сделать так, чтобы неравенство людей с разными доходами было разумным. И этого добиваются именно с помощью прогрессивных налогов и обязательных пенсионных отчислений.
Не нравится — выберите себе любую страну для проживания в высоким коэффициентом Джини.
Деньги имеют ценность, тогда когда они подкреплены производством. До тех пор, пока уменьшение доли трудоспособного населения компенсируется ростом производительности труда, стратегия накоплений и инвестиций работает. В противном случае покупательная способность накоплений будет снижаться.
Также неоднократно высказывались соображения о неэффективности накоплений в начале карьеры (до 35 лет). Поэтому я деньги не откладываю, а инвестирую в собственных детей и недвижимость.
> Другое дело, что не должно быть взносов в пенсионную систему или они должны быть мизерными, а не по 20% от зарплаты как в отдеьно взятых странах.
Если бы все люди поголовно были финансово грамотными, то да. Но в реальности государство вынуждено решать для людей, как им будет лучше. И действительно, лучше отбирать и раздавать, чем доверять каждому своё будущее.
> То есть, всё о чем я хочу сказать, это то, что в сегодняшней обстановке для страны экономически невыгодно обучать даже десяток умников.
У вас очень странные представления об экономической выгоде. Много чего ещё экономически невыгодно: например, платить пенсии, но их зачем-то платят.
> Или взять отношение бизнеса к образованию — никакой участник рынка не станет всерьёз поддерживать образование, если конечно не самоубийца.
Ошибаетесь, очень многие высокотехнологичные компании тесно сотрудничают с университетами, финансируют обучение студентов и аспирантов.
> Зачем государство этим занимается — непонятно. В чём ценность олимпиадников для государства — непонятно. Какой-то фетиш: cпортивное программирование.
Все школьные олимпиады проводятся для выявления талантливых людей. Если не проводить олимпиады, то многие школьники так и не узнают, что у них есть талант.
Ещё хотел бы вам напомнить, что наука уже давно не имеет границ. Результаты научной деятельности учёных доступны всему миру. А в какой стране учёный будет делать исследования, значения не имеет.
> Крутой программист на HTML и CSS, всё ясно.
Ваше право так считать. Меня коробит только когда системных администраторов программистами называют. Впрочем, и они являются программистами, когда скрипты на баше пишут.
> не знаю, при чем тут вообще эти УДК… речи о математике нет.
Это международный классификатор научной информации. Посмотрите на уровень выше: «вычислительная математика, численный анализ и программирование». И ещё выше: просто «математика».
Мнение Вирта — это мнение исключительно Вирта, ваше право с ним соглашаться. Но если вы вдруг будете заниматься наукой, то придётся принять, что де-юре всё, что связано с алгоритмами — это вычислительная математика.
На самом деле это действительно большая проблема. Интернет-площадки склонны к монополизации: покупателям услуг удобнее, чтобы сервис предоставлял как можно больше продавцов, но и продавцам удобнее, чтобы сервис охватывал как можно большую аудиторию.
И такая монополизация очень плоха для продавцов. Когда есть несколько компаний-конкурентов, можно выбрать того, условия которого устраивают больше. Но если комания одна, то у вас нет выбора: придётся либо мириться с условиями, либо терять клиентов. И таких примеров очень много:
— PayPal, который берёт конские комиссии и зажимает деньги, но если вы откажетесь от него, то лишитесь большей части покупателей;
— Booking, без которого вы не сможете нормально продавать гостиничные номера;
— AirBnb, без которого вам придётся платить кучу денег агентствам недвижимости;
— Elsevier, без которого вы лишитесь возможности публиковаться и читать ряд топовых журналов;
— Google, без которого ваш Android-смартфон будет неполноценным.
Пока есть конкуренция между Uber, GetTaxi и кем там ещё — всё хорошо. А что будет, когда останется один Uber?
> государство выдает лицензию конкретному гражданину, который желает потаксовать
Вот здесь и начинается проблема. Государство очень не любит, когда физические лица занимаются предпринимательской деятельностью.
Эти ребята неплохо решают задачи на стыке алгоритмов и математики, поэтому из них получаются хорошие учёные и исследователи как в области математики, так и программирования, но не разработчики.
Принципиальное различие: в языках, отделяющих абстрактный класс от интерфейса, возможно наследование только от одного базового класса, но от нескольких интерфейсов.
Второй важный момент: интерфейс работает как концепт. Фактически, он требует, чтобы класс имел определённый набор методов и свойств, при этом не имеет значения, где они реализованы: в текущем классе или базовых, ничего не знающих об интерфейсе. Такого эффекта невозможно достичь в языках, допускающих множественное наследование.
Всё остальное — действительно техническая ерунда. Важно только понимать, что интерфейсы дешёвые, они не замусоривают vtable и накладные расходы при их использовании ниже, чем при использовании полноценных классов. Особенно актуально это для C++, где виртуальное множественное наследование, используемое для эмуляции интерфейсов, приводит к раздуванию размеров объектов.
> Я вот придерживаюсь мнение Вирта о том, что программирование — это алгоритмы и структуры данных, а вызов Array.Sort — это вбивание текста.
Во времена Вирта программистом не мог называться человек, который не понимает алгоритмы и структуры данных, сейчас — может, т.к. отрасль сильно расширилась.
Крутым программистом сейчас можно назвать и хорошего верстальщика, который наизусть знает все нюансы и хаки CSS, JS.
> Ещё раз, назовите конкретный раздел математики, занимающийся сортировкой или строками
Пожалуйста: УДК 519.683.6 — Методы сортировки.
Отдельной науки «программирование» нет, оно всё подмножество математики в широком смысле.
> Я не понимаю, при чем вообще матлаб и программирование в целом к данному посту в частности, нормально программировать там нельзя.
Разве это не очевидно, что я имею в виду? Алгоритмы и понимание принципов их работы — это математика.
Программирование — это простой вызов библиотечной функции Array.Sort. Математика — выбор конкретной реализации алгоритма сортировки, оптимальной для поставленной задачи. Впрочем, в мои времена любую сортировку нужно было писать вручную.
Можно быть крутым математиком, но не уметь программировать (потолок — MatLab), а можно быть крутым программистом, не способным реализовать алгоритм КМП даже по его описанию перед глазами.
Именно так. Код первичен, паттерн вторичен, а не наоборот.
Если вы пишете код и вам кажется, что этот кусок похож на паттерн, тогда и оформите его как паттерн — код станет легче читать. Применять же паттерны не к месту, начитавшись умных книжек — только портить артихектуру.
Фабрики фабрик вообще идут параллельно и растут корнями из TDD.
На основе своего опыта могу сказать, что основную роль здесь играют способности, затем — практика, а уже потом — знания.
Способности — это умение строить эффективные модели и применять алгоритмы.
Практика — умение быстро и без ошибок реализовывать базовые алгоритмы.
Знания — это представления о базовых алгоритмах.
Неспособного человека невозможно вытянуть. Знаю людей, которые тратили уйму времени на порешивание задач, на изучение умных книг, но которые редко занимали призовые места. И наоборот, способные раздолбаи часто оказывались вверху таблицы.
Задачи, требующих специфичных знаний (численные методы, функциональный анализ, теория чисел), на олимпиадах обычно не встречаются. Поэтому особо много знаний для олимпиадного программирования и не нужно.
> Перед покупкий квартиры брать дешевый аналог, потом продавать?
Почему бы и нет? Мало денег — купил что-то низкокачественное. Появились деньги — переехал в нормальное жильё. Квартиры должны быть разные, а не только хорошие и дорогие.
> Покупать дешевый автомобиль временно?
Именно так и делают во всём мире. Первый автомобиль — дешёвый, «на убой».
> Есть дешевые планшеты
Да, хуже характеристики, но они дают понять, нужен ли мне планшет или нет. Оказалось, что не нужен.
> Пример принтеры, покупал дорогой струйный принтер со множеством чернильниц, для профессиональной печати.
И в итоге вы его использовали для профессиональной печати или для любительской?
Где же вы начинались такого бреда? Доля уехавших среди победителей невелика и мало отличается от обычных учёных. Давайте вообще никого учить не будем, чтобы западу ничего не досталось?
Тренеры олимпиадников, кстати, работают на голом энтузиазме, получая только соответствующую зарплату от школ и университетов.
1. Одна из причин научно-технического прогресса — отказ от старых технологий. Как следствие — отказ от длительной поддержки продукции.
2. Повышение уровня жизни — заслуга исключительно повышения производительности труда. Выше производство — выше потребление.
3. Почему не даёт? Мне нравится, что перед покупкой чего-то дорого я всегда могу попробовать очень дешёвый аналог и понять, а надо ли оно вообще мне?
Я же писал в контекте того, что государство не одобряет, когда обычные люди подрабатывают, минуя контроль со стороны государства. А P2P сервисы, в первую очередь, именно это и предлагают.
1. Разная стратегия использования при наследовании. Если вы хотите иметь возможность перезаписать метод в классе-потомке, то делаете его виртуальным и оставляете открытым. При этом любой вызов открытых виртуальных методов будет осуществляться через vtable.
Методы интерфейса же являются автоматически virtual и sealed. Если хотите перезаписать метод интерфейса, то просто наследуете его второй раз, при этом старые методы будут неявно объявлены во второй раз. Это приводит к тому, что при вызове метода компилятор генерит оптимальный код, а не лезет в vtable.
Единственный подвох такого подхода: если преобразовать класс к базовому, а потом к интерфейсу, то будет использоваться интерфейс от базового класса. Но на практике я с таким не сталкивался.
2. Огромная разница в потреблении памяти. В C++ создаётся по отдельному полю vtable для каждого из множественно наследуемых классов, дополнительная память тратится на разруливание виртуального наследования. В C# информация о множественном наследовании сидит в единственном vtable на каждый объект в виде ссылок на vtable интерфейсов.
Обычно такая двойная адресация не вызывает проблем, т.к. выполняется только один раз. Единственное исключение: generic-методы с interface constraint, где двойная адресация происходит при каждом вызове интерфейсного метода.
В C++ же такое сделать попросту невозможно, т.к. объекты при множественном наследовании не могут располагаться по одному адресу. Из-за этого для каждого из базовых классов и приходится заводить по vtable.
P.S. Подумал — а ведь если это развить, то на отдельную публикацию пойдёт, надо бы заняться. Реально куча интересных нюансов вылезает.
Задача государства сделать так, чтобы неравенство людей с разными доходами было разумным. И этого добиваются именно с помощью прогрессивных налогов и обязательных пенсионных отчислений.
Не нравится — выберите себе любую страну для проживания в высоким коэффициентом Джини.
Также неоднократно высказывались соображения о неэффективности накоплений в начале карьеры (до 35 лет). Поэтому я деньги не откладываю, а инвестирую в собственных детей и недвижимость.
Если бы все люди поголовно были финансово грамотными, то да. Но в реальности государство вынуждено решать для людей, как им будет лучше. И действительно, лучше отбирать и раздавать, чем доверять каждому своё будущее.
У вас очень странные представления об экономической выгоде. Много чего ещё экономически невыгодно: например, платить пенсии, но их зачем-то платят.
> Или взять отношение бизнеса к образованию — никакой участник рынка не станет всерьёз поддерживать образование, если конечно не самоубийца.
Ошибаетесь, очень многие высокотехнологичные компании тесно сотрудничают с университетами, финансируют обучение студентов и аспирантов.
> Зачем государство этим занимается — непонятно. В чём ценность олимпиадников для государства — непонятно. Какой-то фетиш: cпортивное программирование.
Все школьные олимпиады проводятся для выявления талантливых людей. Если не проводить олимпиады, то многие школьники так и не узнают, что у них есть талант.
Ещё хотел бы вам напомнить, что наука уже давно не имеет границ. Результаты научной деятельности учёных доступны всему миру. А в какой стране учёный будет делать исследования, значения не имеет.
Ваше право так считать. Меня коробит только когда системных администраторов программистами называют. Впрочем, и они являются программистами, когда скрипты на баше пишут.
> не знаю, при чем тут вообще эти УДК… речи о математике нет.
Это международный классификатор научной информации. Посмотрите на уровень выше: «вычислительная математика, численный анализ и программирование». И ещё выше: просто «математика».
Мнение Вирта — это мнение исключительно Вирта, ваше право с ним соглашаться. Но если вы вдруг будете заниматься наукой, то придётся принять, что де-юре всё, что связано с алгоритмами — это вычислительная математика.
И такая монополизация очень плоха для продавцов. Когда есть несколько компаний-конкурентов, можно выбрать того, условия которого устраивают больше. Но если комания одна, то у вас нет выбора: придётся либо мириться с условиями, либо терять клиентов. И таких примеров очень много:
— PayPal, который берёт конские комиссии и зажимает деньги, но если вы откажетесь от него, то лишитесь большей части покупателей;
— Booking, без которого вы не сможете нормально продавать гостиничные номера;
— AirBnb, без которого вам придётся платить кучу денег агентствам недвижимости;
— Elsevier, без которого вы лишитесь возможности публиковаться и читать ряд топовых журналов;
— Google, без которого ваш Android-смартфон будет неполноценным.
Пока есть конкуренция между Uber, GetTaxi и кем там ещё — всё хорошо. А что будет, когда останется один Uber?
Вот здесь и начинается проблема. Государство очень не любит, когда физические лица занимаются предпринимательской деятельностью.
Второй важный момент: интерфейс работает как концепт. Фактически, он требует, чтобы класс имел определённый набор методов и свойств, при этом не имеет значения, где они реализованы: в текущем классе или базовых, ничего не знающих об интерфейсе. Такого эффекта невозможно достичь в языках, допускающих множественное наследование.
Всё остальное — действительно техническая ерунда. Важно только понимать, что интерфейсы дешёвые, они не замусоривают vtable и накладные расходы при их использовании ниже, чем при использовании полноценных классов. Особенно актуально это для C++, где виртуальное множественное наследование, используемое для эмуляции интерфейсов, приводит к раздуванию размеров объектов.
Во времена Вирта программистом не мог называться человек, который не понимает алгоритмы и структуры данных, сейчас — может, т.к. отрасль сильно расширилась.
Крутым программистом сейчас можно назвать и хорошего верстальщика, который наизусть знает все нюансы и хаки CSS, JS.
> Ещё раз, назовите конкретный раздел математики, занимающийся сортировкой или строками
Пожалуйста: УДК 519.683.6 — Методы сортировки.
Отдельной науки «программирование» нет, оно всё подмножество математики в широком смысле.
> Я не понимаю, при чем вообще матлаб и программирование в целом к данному посту в частности, нормально программировать там нельзя.
Можно и ещё как. Раширяйте кругозор.
Программирование — это простой вызов библиотечной функции Array.Sort. Математика — выбор конкретной реализации алгоритма сортировки, оптимальной для поставленной задачи. Впрочем, в мои времена любую сортировку нужно было писать вручную.
Можно быть крутым математиком, но не уметь программировать (потолок — MatLab), а можно быть крутым программистом, не способным реализовать алгоритм КМП даже по его описанию перед глазами.
Если вы пишете код и вам кажется, что этот кусок похож на паттерн, тогда и оформите его как паттерн — код станет легче читать. Применять же паттерны не к месту, начитавшись умных книжек — только портить артихектуру.
Фабрики фабрик вообще идут параллельно и растут корнями из TDD.
Способности — это умение строить эффективные модели и применять алгоритмы.
Практика — умение быстро и без ошибок реализовывать базовые алгоритмы.
Знания — это представления о базовых алгоритмах.
Неспособного человека невозможно вытянуть. Знаю людей, которые тратили уйму времени на порешивание задач, на изучение умных книг, но которые редко занимали призовые места. И наоборот, способные раздолбаи часто оказывались вверху таблицы.
Задачи, требующих специфичных знаний (численные методы, функциональный анализ, теория чисел), на олимпиадах обычно не встречаются. Поэтому особо много знаний для олимпиадного программирования и не нужно.
Почему бы и нет? Мало денег — купил что-то низкокачественное. Появились деньги — переехал в нормальное жильё. Квартиры должны быть разные, а не только хорошие и дорогие.
> Покупать дешевый автомобиль временно?
Именно так и делают во всём мире. Первый автомобиль — дешёвый, «на убой».
> Есть дешевые планшеты
Да, хуже характеристики, но они дают понять, нужен ли мне планшет или нет. Оказалось, что не нужен.
> Пример принтеры, покупал дорогой струйный принтер со множеством чернильниц, для профессиональной печати.
И в итоге вы его использовали для профессиональной печати или для любительской?
Тренеры олимпиадников, кстати, работают на голом энтузиазме, получая только соответствующую зарплату от школ и университетов.
2. Повышение уровня жизни — заслуга исключительно повышения производительности труда. Выше производство — выше потребление.
3. Почему не даёт? Мне нравится, что перед покупкой чего-то дорого я всегда могу попробовать очень дешёвый аналог и понять, а надо ли оно вообще мне?