«Тесты — это лишняя работа», «тесты писать необязательно» — такие мнения часто можно услышать в разговорах о тестировании. В этой статье мы постараемся развеять этот миф и рассмотрим плюсы тестирования и минусы его отсутствия.
Тесты делают код более прочным и живучим. Одновременно с этим тесты — это отличная документация, которая не врёт и не устаревает. Также тесты можно использовать как инструмент разработки программы.
Для тестов нужно закладывать больше времени на разработку, это правда. Но время, потраченное в начале работы над проектом, окупится в дальнейшем.
Тест — это код, который проверяет предположения о работе другого кода.
Представим, что у нас есть функция add, которая складывает одно число с другим:
function add(a, b) { return a + b;}
function add(a, b) {
return a + b;
}
Мы предполагаем, что функция прибавляет аргумент b к аргументу a и возвращает нам результат. Мы можем проверить это, вызвав её:
const result = add(10, 5);// result === 15
const result = add(10, 5);
Но что будет, если мы передадим не два числа, а одно? А если передадим не числа? Или функция за время жизни проекта изменится? Чтобы проверить такие предположения, мы пишем тесты.
Самый простой тест, который мы можем написать — ручной. Сравним руками результат работы функции и ожидаемое значение:
function testAdd() { const result = add(10, 5); const expected = 15; console.assert( result === expected, `The result ${result} doesn't match the expected value ${expected}.` );}
function testAdd() {
const result = add(10, 5);
const expected = 15;
console.assert(
result === expected,
`The result ${result} doesn't match the expected value ${expected}.`
);
}
При запуске функции testAdd она проверит, что вернёт функция add. Если результат не будет соответствовать ожиданию, консоль покажет ошибку.
Конечно, такой тест никуда не годится ?
- Ему сильно не хватает описания – как понять, что именно мы проверяем?
- Не хватает выразительности и лаконичности — сравнивать значения и выбрасывать ошибки руками не круто.
- Не хватает интерактивности — чтобы перезапустить тест, нужно запустить функцию заново.
В идеале хотелось бы, чтобы при изменении теста он перезапускался сам. Чтобы было место для описания того, что мы тестируем. Специально для этого придумали инструменты для тестирования.
Инструментов для тестирования много. Чтобы подобрать подходящий, нам надо определиться, какие тесты мы хотим писать. Подробнее о видах тестирования мы поговорим в конце статьи, а пока что посмотрим на самый часто используемый инструмент — Jest.
Попробуем, используя его, переписать тест нашей функции add:
describe('When given 2 numbers', () => { it('returns the sum of those 2 numbers', () => { const result = add(10, 5); const expected = 15; expect(result).toEqual(expected); })})
describe('When given 2 numbers', () => {
it('returns the sum of those 2 numbers', () => {
const result = add(10, 5);
const expected = 15;
expect(result).toEqual(expected);
})
})
Разберём по строкам:
- На первой строке мы указываем описание теста — в каких условиях мы собираемся тестировать функцию.
- На второй строке указываем само предположение о результате — что функция должна нам вернуть.
- На строчках 3–6 выполняем сам тест.
Функция expect помогает избежать работы с ошибками напрямую и предоставляет удобные методы для сравнения аргументов друг с другом.
Обвязка из describe и it помогает нам описать тест в виде самого настоящего текстового предположения, которое код теста проверит.
Теперь разберём, собственно, код теста.
Наш тест состоит из 3 строк:
const result = add(10, 5);const expected = 15;expect(result).toEqual(expected);
const result = add(10, 5);
const expected = 15;
expect(result).toEqual(expected);
Его можно разделить на 3 стадии, которые можно запомнить по мнемоникам:
- ПВП: Подготовка, Выполнение, Проверка;
- или по-английски AAA: Arrange, Act и Assert.
На стадии подготовки мы готовим исходные данные для функции и ожидаемый результат. В более сложных тестах на этой стадии мы бы готовили зависимости для функции и фиктивные объекты.
В нашем случае подготовкой можно назвать выбор аргументов 10 и 5, а также обозначение ожидаемого значения const expected = 15.
На второй стадии мы запускаем функцию, чтобы получить результат. В этот момент мы отрабатываем тестируемый сценарий и получаем значение, которое потом будем проверять.
В нашем случае это строчка с вызовом функции: const result = add(10, 5).
На стадии проверки мы сверяем полученный результат с ожидаемым. Хотя проверка может состоять из нескольких утверждений, хорошей практикой считается внутри одного теста проверять только одно предположение.
В нашем случае проверка — это сравнение результатов на последней строке:
expect(result).toEqual(expected);
expect(result).toEqual(expected);
Идеальный тест состоит из всех трёх стадий ПВП. Часто — такой тест даже состоит из 3 строчек.
Кроме этого, идеальный тест проверяет только одно утверждение. Для проверки разных утверждений лучше написать отдельные тесты.
Идеальный тест не зависит от других тестов. Если тесты зависят друг от друга, они могут влиять и на результаты проверки друг друга. Правильно написанный тест можно запустить где и как угодно, и его результат не изменится.
Может показаться, что тестирование это пустая трата времени, и лучше выделить это время на другие задачи. И правда, на начальных этапах жизни проекта тесты отнимают время. Но в будущем написанные тесты сохранят больше времени, потому что будут играть роль и документации, и инструмента разработки, и проверки ранее написанного кода.
Рассмотрим основные плюсы тестирования.
Когда мы пишем программу, мы чаще думаем об основном сценарии работы (happy path), часто забывая о крайних случаях.
Тесты смещают фокус с основного сценария на «что может пойти не так». Когда мы пишем тесты, мы больше склонны искать ошибки и неадекватную работу функции. Чем больше крайних случаев мы обработаем, тем надёжнее будет код.
Регрессия — это ошибка, которая возникает в уже работающей части системы после изменений в коде. Это может быть добавление новой функциональности в старый код или доработка общих функций.
В нашей голове может уместиться лишь небольшой кусочек системы, которую мы программируем. Большая часть системы всегда находится вне поля нашего зрения. Это значит, что при добавлении функциональности мы можем не учесть особенности работы уже существующего кода.
Тесты закрывают такие ошибки, потому что падают при возникновении неучтённой ситуации и не дают ей отправиться в продакшен.
Когда мы рефакторим код, мы изменяем его структуру. Ошибки при рефакторинге появляются по той же причине — мы не можем держать всё в голове.
Даже если мы уверены, что полностью знаем кусок, который рефакторим, мы не застрахованы от более простых ошибок:
// 1.let a = 15;if (a == 20) {}// 2.let a = 15;if (a = 20) {}
let a = 15;
if (a == 20) {}
let a = 15;
if (a = 20) {}
Второй случай в примере выше всегда будет истинным, потому что в условии вместо сравнения — присваивание. Тесты уберегут от подобных ошибок.
Это частный случай регрессий. Обновление зависимостей не только исправляет баги и несёт новые фичи, но иногда и ломает логику работы. Если наш код протестирован, то такие ломающие обновления мы определим сразу.
Тесты не врут ?
Они действительно показывают, как работает система.
Дополнительная документация может устареть, особенно часто это случается с комментариями. Если документация устарела, у нас появляется два источника правды: документация и код. Это плохо, потому что непонятно, чему верить, и как программа должна работать. Тесты же точно говорят, как программа работать должна и работает ли.
Кроме этого, хорошо написанные тесты читаются как текст на английском языке. Из их описаний при желании можно автоматически сгенерировать и текстовую документацию.
Тестирование не бесплатное, за надёжность кода приходится платить.
На старте проекта издержки ощущаются больнее всего. Чем моложе проект, тем субъективно большую долю времени будут занимать тесты. В этот момент желание плюнуть и не писать тесты сильнее всего, потому что время как будто уходит на бесполезную работу.
Это, конечно, не так. Чем проект старше, тем больше мы получаем выгоды от написанных тестов.
Избавиться от ощущения ненужности тестов можно, если заранее закладывать время на них в план, а также считать их базовой гигиеной при работе. Часть команд и проектов сейчас не работают без тестов вовсе. Такие команды — это хорошая среда для того, чтобы привить себе привычку к тестированию на уровне автоматизма.
При работе с тестами приходится использовать фиктивные объекты и данные. Например, для проверки аутентификации мы не поднимаем настоящий сервер, а используем заглушку для него, которая отвечает нужными нам в конкретном тесте данными.
Чтобы не запутаться во всех фиктивных объектах и данных, для них нужно организовать структуру. Чем удобнее структура, тем проще писать тесты.
Грамотно организовать систему с фиктивными объектами сложно. Это требует навыков проектирования, знаний о хорошей архитектуре и опыта.
Тесты в проекте существуют, как правило, вместе с автоматическими задачами, которые их запускают. Они, например, могут отменять релиз, если при обновлении кода тесты не проходят.
Настройка таких задач — это тоже дополнительная работа.
Хорошо, вот мы взвесили все преимущества и недостатки тестирования. Если мы хотим внедрить тестирование в своём проекте, то какие тесты нам писать?
Тесты бывают разных видов и проверяют они тоже разные вещи. Рассмотрим основные типы тестов в виде пирамиды и поговорим о каждом.
Пирамида тестирования: в основании Unit-тесты, чуть выше интеграционные, на вершине — End-to-End.
В основании пирамиды лежат юнит-тесты. Их ещё называют модульными тестами или блочными тестами.
Такие тесты проверяют работу конкретного модуля, функции или части программы. Когда мы писали тест для функции add выше, мы писали именно юнит-тест.
Особенность таких тестов в том, что они затрагивают лишь одну часть программы, никак не проверяя остальные. Если тестируемый модуль ссылается на другие модули, то вместо них мы будем использовать фиктивные объекты. Поведение таких объектов мы смоделируем таким, как нам требуется в каждом конкретном тесте.
Как правило, большая часть тестов в проекте — это модульные тесты. Их проще писать, для них не требуется слишком сложной структуры. Они быстро проверяются и их можно запускать параллельно, потому что они не зависят друг от друга.
Интеграционные тесты проверяют, как между собой взаимодействуют две и более части программы, которые работают над одной задачей (то есть как они интегрированы друг с другом, отсюда название).
Для интеграционных тестов нужна структура чуть сложнее, чем для модульных. Чтобы запустить интеграционный тест, надо изолированно запустить несколько частей программы.
Часто для интеграционного тестирования нужен отдельный фреймворк, который умеет читать спецификации задач и проверять, что программа работает правильно. Важно, что в таком тестировании мы проверяем не порядок вызова частей программы, а именно результат их совместной работы.
Интеграционными тестами проверяют связующие модули (так называемое middleware):
- юнит-тесты проверяют прямое назначение middleware в целом;
- интеграционные — как middleware взаимодействует с конкретными модулями.
Они же End-to-End тесты, они же системные тесты — это проверка работы программы в целом.
Такие тесты играют роль пользователей, которые ходят по приложению и выполняют разные задачи. Для этих тестов тоже необходим фреймворк, который умеет манипулировать приложением, как это делают люди.
Например, мы захотели полностью проверить, как работает регистрация на сайте. Мы можем написать сценарий для «робота», который будет ходить по сайту, заполнять формы и проверять, как прошла регистрация.
Приёмочные тесты — это проверка программы перед сдачей клиенту или релизом. Как правило, такие тесты ручные и включают в себя сложные сценарии из спецификаций или технического задания.
Во фронтенд-разработке они встречаются реже всех остальных, но часто используются при разработке десктопных программ или приложений для телефонов. У таких приложений более долгий цикл доставки до пользователя, поэтому приёмочные тесты обычно проходят перед релизом. В вебе цикл поставки короткий, и тесты стараются максимально полно автоматизировать.
Даже при наличии издержек тестирование экономит силы, время и деньги в долгосрочной перспективе. Отказаться от тестирования можно, если:
- мы разрабатываем прототип, который не пойдёт в продакшен — скорость важнее;
- или проект точно не будет жить долго — предсказать такое сложно, но если мы уверены, что тесты не успеют окупиться, ими можно пренебречь.
В остальных случаях тесты лучше писать с самого начала.
Амир учится на первом курсе филологического факультета ОмГПУ, но за его плечами большой творческий опыт: он играл на сцене Лицейского театра, снял несколько короткометражных фильмов и с головой погрузился в русскую литературу.
— Назови три любопытных факта о тебе?
— Никогда не ломал себе ноги, падая с большой высоты. Люблю природу. Люблю утром кататься на трамвае.
— Куда ездишь на трамвае?
— Да по всему городу катаюсь. Просто, красиво там. Ну, в разных частях города.
— Это путешествие без цели?
— (Кивает). Бывает с целью. Бывает на учёбу и прочее.
— Почему выбрал филфак?
— Литературу люблю, но, короче, не так всё работает.
— Я знаю, что ты играл в театре. Расскажи об этом опыте. Играешь ли сейчас?
— В июне последний спектакль отыграл. Очень много во мне осталось от театра. Значимыми обрывками вспоминается.
— Почему ушёл из театра? Что он тебе дал?
— Некий концентрат боли. Как по мне, человек, занимающийся стихами, не может служить в театре, так как это два несовместимых в идейном смысле дела.
— Какие ещё виды искусства тебе близки? Хочешь ли связать свою жизнь с искусством?
— Понимаешь, понятие искусство, как и литература, слишком многослойно. Как по мне, под ним подразумевается общественная какая-то сторона, не частная боль человека. И звучит здраво слишком.
Нет такого, что «я хотел бы быть связанным с искусством». Ты либо от природы с этим связан, либо нет. Ты либо подобрался, прорвался к своей сути, либо нет, открыл в себе грань «быть», либо нет. Такое не выбирают. Я, наверное, в этом смысле фаталист.
Понятие «искусство» отдаёт чем-то эстетичным, правильным и глупым. Мне это не близко.
— Но ты хочешь выражать свою боль, облекая её в некоторую форму, поэтическую или иную другую, а не работать, скажем, на заводе, в IT-компании и т. п.?
— Я не смогу там работать только из-за денег. Наверное, из-за этого многие этим занимаются.
— И если уходить от термина «искусство», как бы ты назвал то, чем занимаешься?
— Хочу верить, что делом.
— Ты снял несколько короткометражек «Сказ о конце», «История одного дня», «12 соток» и «Какое небо, такое море». О чём они?
-Вообще сложный вопрос, потому что, как бы я ни пытался при создании сценария писать через идею какую-то и вообще схематично (ну, книги по кино читал), всё выходило по-другому: что-то, как строчки, наплывает в голову, записывается, проживается внутри, фиксируется; в памяти складывается полное полотно, скажем, а затем из этого вычленяется некая идея, даже, скорее, настроение.
Но, конечно, я задавался этим вопросом (о чём фильмы — прим. ред.) и внутри себя отвечал на него (с «12 соток» точно): об одиночестве внутри места, которое умирает.
Это ассоциативно очень, здесь нет никаких приёмов игрового кино. Поэтому говорю — это кино постановочное. В нём в меньшей степени задействована режиссура — специально в титрах пишу, что это постановка. Работаю с изображением, натурой — наверное, самое главное — цветом, музыкой (пишу, простите ради Бога, сам, если это вообще можно назвать музыкой: она задумывалась как дыхание города), погодой, временами года, словом.
Вообще по итогу понимаешь, что только практикой познается всё.
х.ф. «Какое небо, такое море», реж. Амир Сабиров
— Не боишься выражать себя натуралистично?
— Ну, просто не могу промолчать об этом, раз спросила. Это, к сожалению, мной не проговаривается. Для меня очень важно не сфальшивить внутри. Когда я занимался в театре, то часто обманывал и мастеров с ребятами, и себя. Просто я думал, что сублимация — выход. Это не так.
Боли много, она повсюду и у каждого. Мандельштам про это говорил Надежде Яковлевне, жене; когда присутствует экспрессия, получается фальшь. Мне бы хотелось приравнять кино к поэзии, как к высшей форме проявления человека, к высшему слою, скажем, бытия: состраданию, любви к тому, что всем противно. Поэтому совмещаю. Ладно, бог с ним. Это другой разговор.
— Кого снимаешь в фильмах, кто эти люди?
— Близкие мне люди. Они видели меня разным. К тому же они, что называется, фактурные. У нас в городе ещё очень много таких (в том числе локаций — Красноярский тракт, дачные территории, Порт-Артур, недавно открыл для себя гениальную архитектуру Старого Кировска, сталинки; к тому же я ещё не все квартиры обошёл и под землей не бывал). Как помнишь, Герман (режиссёр Алексей Герман — прим. ред.) ездил по провинциальным театрам, искал незамыленные лица и поставил в пару с Мироновым в «Лапшине» Андрея Болтнева. Так как нет никакого кинопроизводства (в Омске, прим. ред.), то здесь очень всё частно, сам съёмочный процесс ничего общего не имеет с тем, что принято им называть.
Понимаешь, я очень мало снял, поэтому говорить много об этом не буду. Но вот что хочу сказать — люди, которых я снимал, вполне могли находиться (и находятся) в той натуре, локации, где были съёмки. Это ближе к документальному чему-то, к жизни.
Грустно, конечно, от этого. Но ведь кино только недавно стало вечным искусством, когда люди, создававшие первые картины («Оборона Севастополя» 1911 года), умирали во имя дела — кино. И умерло уже не одно поколение, как по мне. Просто я из другого поколения, которое плёнку не застало, и, чтобы отснятый материал посмотреть, нужно просто минут пятнадцать подождать, пока на компьютер перекинется, и ещё сколько-то, пока обработается в монтажной программе.
А ведь раньше было по-другому, и я не знаю как.
— Какое состояние природы тебе созвучно?
— Утро. Ранняя зима. Воскресенье. Недалеко, может быть, от церкви. Красиво. Прохладно. Звучат колокола.
— В одном из твоих фильмов женщина на протяжении нескольких минут молится. Какую роль в своей жизни ты отводишь богу?
— Это мама главного героя молитву читает — за счастье. А его уже такого не будет — счастья. Когда рождается человек, рождается Бог, и он в каждом. Как сказал Сокуров, при съёмках Бог не поможет.
Я считаю, что нет никакой высшей силы. Она создаётся гениальным человеком и затем поддерживается другими, если без выдумок. Хотя, безусловно, существует некий высший разум, то, что в этом мире называется судьбой.
— Возвращаясь к поэзии: помню, однажды ты сказал, что рэп – это тоже поэзия. Можешь поделиться исполнителями, чьи тексты тебе нравятся?
— Когда я это говорил, мне было лет четырнадцать, кажется. Хотя имена, которые я тогда называл, совсем поменялись, и слава Богу, потому что условный Оксимирон и прочие ничего общего с поэзией не имеют, разве что с каким-нибудь литературным (замечу в скобках, невзначай) направлением. Конечно, мне неизвестен процесс создания рэпа. Ведь зачастую там сперва пишется бит, а затем уже остальное. К тому же это дело денежное, выгодное, в отличие от коренной поэзии. Уж простите.
Причём радует, что все эти имена (рэперов — прим. ред.) родом из провинции: Тара, Омск, Улан-Удэ. Не стоит выкидывать из головы тот факт, что всё же это музыка, и, говоря о тексте, я говорю о том, что я слышу, когда слушаю, как бы поэты Серебряного века читают в своей интонации.
Андрей Александрович Бледный, почти одногодка Рыжего (поэта Бориса Рыжего прим. ред.), конкретно он из группы 25/17, гений современности, потому что его строчки:
«сквозняки поют в расколотом темени»,
«..постучи тем шифром, что я в дверь стучал, она узнает и поймет: я скучал…»,
«поколение щеглов небитых из контактика навряд ли что-то поймёт, и в этом тактика»,
«из динамиков хрипели в небо голоса Кай Метов, Апина, Буйнов — лютая попса» и
«ждёт колея, чужие лбы целую я…» — эти строчки потрясают.
Короче, послушайте альбомы «Умереть от счастья» целиком, «Байки из склепа», «Русский подорожник» и поймёте, о чем я. Он, как по мне, самое важное берёт из поэзии: монолитность слов и дела. (Послушайте интервью)
Для меня, безусловно, Игорь Федорович Летов является таким же. Но это уже ближе к философии, в ней меньше этой музыки; ближе к коренным вопросам. «Наше дело почётное словно кипение масла в кровавой каше, словно строчка, бегущая прочь». Ну, тут музыка очень много делает; именно музыка времени; та, что услышал в тридцатые Мандельштам. Альбомы: «Солнцеворот», «Долгая счастливая жизнь» (композиция оттуда звучит в моём последнем фильме), «Реанимация»; то, что я расслышал и понял.
Хотел бы про Дмитрия Кузнецова сказать, но не буду. Ему культа личности по горло хватило.
Вообще их очень много, ну, поэтов, так называемых. Просто страшно много.
Плейлист от автора
— Что для тебя самого важно и ценно в поэзии? В чём ты находишь настоящее (в философском смысле) и что выражаешь в своих стихах?
— Не могу сказать толком — много что в это умещается. Любовь где есть, наверное. Даже в страшной «Элегии» Введенского это есть.
— Каких людей ты бы поблагодарил за то, что они были в твоей жизни?
— Мне кажется, об этом рано говорить: они ещё живы.
— Назови поэтов или писателей, которые не оставляют тебя равнодушным?

Да много их. Неравнодушен ты вообще ни к чему. Везде есть участие, (даже к Хомякову и Мею) (поэты А. С. Хомяков и Л. А. Мей — прим. ред.), и к графоману, и к гению (слово сейчас подвержено упрощению, обессмысливанию). Страшное время: проявление молодости — талант, графоман — смелый и амбициозный человек, а не заблудившийся. Мне это непонятно.
Если буду перечислять, то просто всю русскую прозу и поэзию двух этих веков перечислю.
Лермонтов, Мандельштам, Башлачёв, Тютчев, Кольцов; пусть так. (Никитин в меньшей степени.)
Пушкин поздний и вся его проза, Достоевский, Чехов, (у них от Пушкина, если вглядеться, очень много; прямо поражает). Прилепина очень люблю как современного. Многие в двадцатом веке в кино перешли, поэтому я как бы не совсем их разделяю, то есть для меня это корнями так сплетено.
Лосева недавно прочитал впервые. Сильно поразило. Вообще у нас живы великие классические русские поэты — один вообще передачи на Арзамасе выпускает — Сергей Гандлевский, Александр Кушнер, Бахыт Кенжеев.
Вообще хочу сказать про Коляду (драматург Николай Коляда, прим. ред.), про его пьесы. «Америка России подарила пароход «, «Землекоп» — очень страшная вещь, я не знаю, как такое написать можно было, «Солнечное затмение». У него очень много пьес, он десятитомник выпускал.
— Бывает ли тебе больно внутри? Если да, то от чего?
— Без боли невозможно. Мне бывает больно от всего.
Фото из личного архива героя публикации
Автор интервью: Мария Хоменко
Добрый день, Хабр.
Я около года работаю с Ruby и хотел бы написать о некоторых вещах, которых лично мне там часто не хватает, и которые я хотел бы видеть встроенными в язык. Пожалуй лишь пара из этих пунктов являются действительно серьезными недоработками, с остальными можно легко справиться подручными средствами.
Вроде бы недоработки и мелочь, но они ощутимо осложняют работу — приходится писать собственные библиотеки вспомогательных методов, которые и в гем не выделишь — уж больно маленькие, и без них некомфортно. А порой открываешь чужой код — и видишь там точно такие же вспомогательные функции как у тебя. Это как мне думается знак, что стандартная библиотека языка недоработана. Что же, будем надеяться, кто-нибудь из разработчиков прочтет текст и закоммитит патч. 
Итак, начнем по порядку:
- Перегрузка метода разными списками аргументов, как в C++
- Отобразить хэш и получить из него другой хэш, а не массив
- Преобразовать экземпляр класса в экземпляр его же собственного подкласса
- Разные рюшечки
Перегрузка метода разными списками аргументов, как в C++
Вот это на мой взгляд одна из самых больших проблем руби. Он не позволяет определить метод по разному для разных типов аргументов. В результате приходится писать сложные конструкции разбора списка параметров, проверять типы, наличие-отсутствие аргументов итд. Я не претендую на решение этой проблемы, чтобы её решить надо перелопачивать исходники, писать много кода и ещё больше тестов. Поэтому я покажу лишь реализацию, которая в простейших случаях может сэкономить вам пару строк кода.
Для этого мы воспользуемся alias-method-chain’ингом.
module MethodOverload
module ClassMethods
def overload(meth, submethods_hash)
if method_defined?(meth)
alias_method "#{meth}_default_behavior", meth
has_default_behavior = true
end
define_method meth do |*args,&block|
submethods_hash.each do |sub_meth,arg_typelist|
if args.size == arg_typelist.size && args.to_enum.with_index.all?{|arg,index| arg.is_a? arg_typelist[index]}
return self.send(sub_meth,*args,&block)
end
end
if has_default_behavior
return self.send("#{meth}_default_behavior",*args,&block)
else
raise ArgumentError
end
end
end
end
def self.included(base)
base.extend(ClassMethods)
end
end
Напишем функцию такую, чтобы она выдавала следующие результаты:
x = X.new
x.f # => "original version []"
x.f 3, 'a' # => "original version [3,"a"]"
x.f 3, 4 # => "pair numeric version 3 & 4"
x.f 3 # => "numeric version 3"
x.f 'mystr' # => "string version mystr"
Вот как это выглядит, если имитировать перегрузку метода:
class X
include MethodOverload
def f(*args)
'original version ' + args.to_s
end
def f_string(str)
'string version ' + str.to_s
end
def f_numeric(num)
'numeric version ' + num.to_s
end
def f_pair_numeric(num1,num2)
"pair numeric version #{num1} & #{num2}"
end
overload :f, f_string:[String], f_numeric:[Numeric], f_pair_numeric:[Numeric, Numeric]
end
Вместо этого, конечно, можно просто написать одну функцию
class X
def f(*args)
if args.size == 2 && args.first.is_a? Numeric && args.last.is_a? Numeric
"pair numeric version #{args[0]} #{args[1]}"
elsif args.size == 1 && args.first.is_a? String
'string version ' + str.to_s
elsif args.size == 1 && args.first.is_a? Numeric
'numeric version ' + num.to_s
else
'original version ' + args.to_s
end
end
end
Однако такой метод очень быстро раздувается и становится неудобен для чтения и добавления возможностей. К сожалению в подходе описанном мной остаются проблемы такие как работа с аргументами по-умолчанию и сжатие списков (*args), но думаю их можно решить слегка расширив метод overload. Если сообществу покажется, что такой подход неплохо было бы развить — я попробую сделать на эту тему отдельную статью и расширю код.
Мне хотелось бы в будущих версиях руби иметь встроенные средства для подобной перегрузки метода.
Отобразить хэш и получить из него другой хэш, а не массив
Честно сказать я в недоумении, почему этого метода нет прямо в Enumerable, это одна из самых частых конструкций, которая бывает нужна. Её я безусловно хотел бы иметь отдельным методом, и даже не во втором руби, а чем раньше тем лучше (тем более, что это плевое дело).
У меня часто возикает задача пройтись по хэшу и сделать из него другой хэш. Этакий map. Вот только map для хэша вам выдаст что? Правильно, массив. Обычно приходится выкручиваться подобной конструкцией:
{a: 1, b:2, c:3, z:26}.inject({}){|hsh,(k,v)| hsh.merge(k=>v.even?)} # => {a: false, b: true, c:false, z: true} Есть ещё один вариант
Hash[{a: 1, b:2, c:3, z:26}.map{|k,v| [k,v.even?]}] Этот вариант чуть попроще и погибче т.к. позволяет отображать не только значения, но и ключи. Однако совершенно явно, что массивам не хватает метода to_hash, чтобы писать не Hash[arr], а arr.to_hash.
Однако не ко всем массивам такой метод будет применим, вероятно по этим причинам метода Array#to_hash и нет в ядре(см. обсуждение).
Это намекает, что стоит сделать производный от Array класс HashLikeArray, принимающий лишь массивы вида [[k1,v1],[k2,v2],…], но об этом в следующем пункте.
А пока реализуем простой hash_map, основанный на методе inject:
class Hash
def hash_map(&block)
inject({}) do |hsh,(k,v)|
hsh.merge( k=> block.call(v))
end
end
end
А теперь про реализацию класса, производного от Array. С этим возникают некоторые проблемы, которые мы сейчас будем пытаться решить.
Преобразовать экземпляр класса в экземпляр его же собственного подкласса
Понятно, что нет проблемы создать класс, производный от Array, но нам же нужно каким-то образом подменить метод Hash#to_a так, чтобы он возвращал не Array, а этот производный класс HashLikeArray. Вы, конечно, можете попробовать написать свою реализацию этого метода, но на самом-то деле вам нужна лишь обертка, которая превращает результат исходного Hash#to_a из класса Array в подкласс HashLikeArray.
Давайте попробуем написать (не заморачиваясь сейчас никакими alias’ами)
class HashLikeArray < Array
def initialize(*args,&block)
#raise unless ... - всякие проверки на то, правильного ли вида массив мы пытаемся задать
super
end
end
class Hash
def to_a_another_version
HashLikeArray[*self.to_a] # тут нам повезло, что есть метод Array::[]
end
end
{a:3,b:5,c:8}.to_a.class # ==> Array
{a:3,b:5,c:8}.to_a_another_version.class # ==> HashLikeArray
Справились. Теперь задачка посложнее, пусть у нас есть класс менее проработанный, чем Array:
class Animal
attr_accessor :weight
def self.get_flying_animal
res = self.new
res.singleton_class.class_eval { attr_accessor :flight_velocity}
res.flight_velocity = 1
res
end
end
class Bird < Animal
attr_accessor :flight_velocity
end
Теперь пусть у вас есть старый метод get_flying_animal, который писался, когда класса Bird ещё не существовало. Animal::get_flying_animal всегда возвращал птиц с проставленными аттрибутами, но чисто формально они были класса Animal. Теперь попробуйте не меняя класса Animal сделать метод Bird::get_flying_animal, который выдает тех же самых птиц по тому же алгоритму, но только теперь класса Bird. Да, метод get_flying_animal на самом деле гораздо объемней, чем в примере и дублировать его вы не хотите.
Особенно эта ситуация может испортить вам жизнь, если вы не можете менять класс Animal, либо даже не знаете его исходников, т.к. они написаны, например, на си. (В качестве упражнения, попробуйте написать свою версию метода HashLikeArray#to_a, не используя методов Array::[] или Array#replace. Дублировать код у вас просто неоткуда, если конечно, вы не собираетесь писать си-шную библиотеку)
Я придумал как это сделать лишь неэлегантным способом, копируя все переменные экземпляра в объект производного класса
class Object
def type_cast(new_class)
new_obj = new_class.allocate
instance_variables.each do |varname|
new_obj.instance_variable_set(varname, self.instance_variable_get(varname))
end
new_obj
end
end
Теперь можно сделать так:
def Bird.get_flying_animal
Animal.get_flying_animal.type_cast(Bird)
end
Если кто-то знает, как заменить этот неуклюжий костыль в виде метода type_cast — пишите, это крайне интересный вопрос.
Вообще говоря это спорный вопрос, насколько корректно так переопределять тип класса на тип подкласса. Я бы сказал, что это грязный хак и вообще не ООП, но иногда очень полезный хак… Руби — это такой специальный язык, где каждое правило нужно лишь за тем, чтобы было ясно, что именно можно нарушить. Думаю это не пошло бы сильно вразрез с принципами руби, если бы у объекта можно было поменять класс на любой другой уже после создания, директивно сказав что-то вроде:
x=X.new
x.class = Y
Ведь класс означает фактически лишь область для поиска методов, констант и @@-переменных, так какая разница, когда определять класс: в момент создания или после. Вся ответственность за целостность объекта с этого момента лежит на плечах пользователя, но это его право. Более того, если новый класс — подкласс старого, то ответственность большей частью делегирована старому классу.
Разные рюшечки
Теперь по мелочам:
Метод возвращающий self
Кроме того я бы предложил ввести метод вроде
def identity
self
end
Полезно это для того, чтобы можно было в блоках писать что-то вроде .collect(&:identity) вместо .collect{|x| x}
В случае с нумераторами и collect-ом все решается просто — методом to_a можно получить полный список объектов, а вот если вы пишете свой метод, принимающий блок, то функция может оказаться полезной.
Например сделаем метод наподобие рельсовского метода Nil#try .
class Object
def try(method_name,&block)
send method_name
rescue
yield
end
end
Теперь мы можем сделать
x.try(:transform,&:another_transform) И вот тут нам может понадобиться наш метод identity:
x.try(:transform, &:identity) — если преобразование сделать можно, оно будет сделано, нет — будет возвращен исходный объект.
Метод Object#in?(collection)
Рельсовский метод
color.in?([:red,:green,:blue]) гораздо лучше смотрится, чем
[:red,:green,:blue].include?(color) Пишем:
def in?(collection)
raise ArgumentError unless collection.respond_to? :include?
collection.include? self
end
Ради этого метода подключать целую библиотеку (кажется ActiveSupport) очень лениво. Думаю, что этому методу в ядре жилось бы неплохо.
Отрицательная форма вопросительных методов
Хотелось бы писать arr.not_empty? вместо неуклюжего !arr.empty? Подобных вопросительных методов в руби очень много, а отрицаний почти что нет. Методы типа not_empty? и not_nil? хотелось бы иметь встроенными в стандартную библиотеку. Собственные вопрос-методы я предпочитаю доопределять отрицаниями с помощью method_missing (по понятным причинам method_missing у класса Object менять не рекомендуется)
class X
def method_missing(meth,*args,&block)
match = meth.to_s.match(/^not_(.+?)$/)
return !send(match[1], *args,&block) if match && respond_to?(match[1])
super
end
end
X.new.not_nil? # => true
Отрезаем расширения файлов
Отдельная ненависть у меня к модулю File, в котором нет методов filename_wo_extname и basename_wo_extname. Исправляем:
class File
def self.filename_wo_ext(filename)
filename[0..-(1+self.extname(filename).length)]
end
def self.basename_wo_ext(filename)
self.basename(filename)[0..-(1+self.extname(filename).length)]
end
end
File.basename_wo_ext('d:/my_folder/my_file.txt') # => "my_file"
File.filename_wo_ext('d:/my_folder/my_file.txt') # => "d:/my_folder/my_file"
Немного радостей
Мне следует загладить свою вину за такую гору жалоб перед — несмотря ни на что — замечательным языком Ruby. Поэтому поделюсь одним из радостных известий из мира руби — Ленивые нумераторы .
Подешевле или по дешевле?
Даже если вы ничего никогда не продавали через интернет, всё же наверняка хоть раз, но приценивались к какой-нибудь вещи на популярных платформах. И, возможно, даже писали продавцу с вопросом, не продаст ли он товар подешевле? Но, собственно, грамотно ли вы задавали ему этот вопрос? Ведь даже если торговля и не экзамен, всё же с грамотным человеком общаться приятнее. Поэтому знать, как правильно пишется – подешевле или по дешевле – не будет лишним никогда. Возможно, и сэкономить получится.
Правописание слова
Главное затруднение в правописании этого слова – слитно или раздельно оно пишется. Поэтому сначала надо понять, что это за часть речи.
Зададим вопрос: «как? – подешевле». Попробуем изменить по числам, родам и времени:
- купит подешевле: буд. время, неопред.-личное;
- купила подешевле: прош. время, жен. род;
- покупают подешевле: наст. время, мн. число.
Как видим, форма слова не изменяется ни от времени, ни от числа и рода. В русском языке такие признаки имеет наречие. Следовательно, изучаемое нами слово – это наречие образа действия.
Произошло оно от наречия «дёшево», которое, в свою очередь, произошло от прилагательного «дешёвый». Соответственно, в прилагательном корень «-дёшев-», «-ый» – окончание. Наречие же образовано при помощи суффикса «-о-».
В свою очередь, при помощи суффикса «-л-» образована сравнительная степень наречия «дёшево» – «дешевле». Но что такое «по»? Это предлог или приставка?
- Во-первых, если бы «по» было предлогом, то между им и последующим словом можно было бы вставить другой слово без потери смысла, например, прилагательное: «по столу – по деревянному столу». В «подешевле» никакое слово вставить нельзя.
- Во-вторых, предлог «по» используется только перед существительными и местоимениями. А «дёшево» – это, как мы уже выяснили, наречие. Следовательно, предлогом в данном случае «по» быть не может. Это приставка. А приставки всегда пишутся слитно.
Наличие приставки «по» превращает литературное написание наречия «дешевле» в разговорное.
Между тем, в русском языке действует правило. Согласно ему наречия в сравнительной степени, образованные с помощью приставки «по», пишутся слитно.
Примеры предложений
- — Слишком дорогие помидоры у вас, хотелось бы купить чуть-чуть подешевле. Может уступите рублей девяносто или сто?
- Хотя Мария гордилась тем, что на последней распродаже ухватила моднейшее платье подешевле, её всё же гложил тот факт, что она снова спустила все свои деньги на одежду.
- Павел Петрович по-дружески сказал Федьке, племяннику, который решил обзавестись своим бизнесом: «Запомни. Товар, что подешевле, ставишь на самые дальние полки, а подороже – вперёд».
- Тетка Варьки с соседнего двора была уверена, что если брать продукты огромными пачками, то в итоге выходит подешевле, а она на этом экономит.
- А вы не продадите этот деревянный стол с необычными ножками подешевле? – поинтересовалась у консультанта бабушка в изысканной шёлковой блузе цвета фуксии.
Ошибочное написание
Неправильно писать раздельно и через дефис: «по дешевле», «по-дешевле». Также неверным будет написание «падешевле».
Синонимы слова
Дешевле, недорого, попроще, экономнее, меньшей цены, доступнее, даром.
Заключение
Итак, чтобы правильно написать подешевле, нужно запомнить, что это наречие, а наречия в сравнительной степени с приставкой «по» всегда пишутся слитно.
Слово «подешевле» как пишется, слитно или раздельно?
Слово «подешевле» пишется слитно с приставкой по- как сравнительная степень наречия.
Узнаем, как правильно пишется слово «подешевле», «по дешевле» или «по-дешевле», слитно, раздельно или с дефисом?
Часть речи и форма слова «подешевле»
Чтобы определиться с написанием этого слова, проанализируем, грамматической формой какого слова оно является и как образовано. В этом случае существует прямая зависимость написания интересующего нас слова от способа его образования.
Хочется купить спелую клубнику на рынке подеше́вле.
Слово «подешевле» обозначает признак действия, отвечает на обстоятельственный вопрос и не изменяется. Это грамматические признаки наречия.
Слово «подеше́вле» является грамматической формой наречия «дешево», которое образовано от однокоренного прилагательного «дешёвый». Чтобы это было более наглядно, проследим словообразовательную цепочку и посмотрим формообразование наречия:
- дешевый → дёшев о ;
- дёшево — дешевл е , по деше́вле.
От прилагательного «дешевый» вначале образуется наречие с суффиксом -о, а далее образуются формы наречия простой сравнительной степени:
- приобрести дешевле;
- купить подешевле.
Как видим, морфема по- в составе рассматриваемого наречия — это приставка, которая пишется, конечно, слитно со словом.
Все наречия, образованные от качественных прилагательных, имеющие в морфемном составе простую сравнительную степень, как правило, пишутся слитно.
Понаблюдаем:
- громкий — громко; громч е , по громче;
- далекий — далеко; даль ше , по дальше;
- близкий — близко; ближ е , по ближе;
- чистый — чисто; чищ е , по чище;
- слабый — слабо; слаб ее , по слабее.
Между словом и приставкой невозможно вставить синтаксический вопрос или определяющее слово. Также учтем, что форма сравнительной степени прилагательного и однокоренного наречия не изменяется. Она не может иметь при себе предлога, как например слова изменяемых частей речи:
- ходить по мосту;
- плывет по воде;
- тоскует по вас;
- стекает по мне.
Чтобы усвоить слитное написание рассмотренного слова, предлагаем прочесть примеры предложений.
Примеры предложений
Не всякая покупка подеше́вле обладает высоким качеством.
Придешь на рынок к концу дня и купишь фрукты подеше́вле.
Мы хотим приобрести кухонную сантехнику подеше́вле, пользуясь торговой скидкой.
“Подешевле” или “по дешевле”, как правильно пишется?
Как правильно написать слово: “подешевле” или “по дешевле ”?
Правило:
Приставки со словами всегда пишутся слитно.
Слово “подешевле” образовано от прилагательного (наречия) в сравнительной степени “дешевле” с помощью приставки “по-“.
Поэтому, данное слово пишется так: “подешевле”.
Примеры с использованием слова “подешевле”:
– Нешто мужики – люди? Не люди, а, извините, зверье, шарлатаны. Какая у мужика жизнь? Только есть да пить, харчи бы подешевле, да в трактире горло драть без ума; и ни тебе разговоров хороших, ни обращения, ни формальности, а так – невежа! И сам в грязи, и жена в грязи, и дети в грязи, в чем был, в том и лег, картошку из щей тащит прямо пальцами, квас пьет с тараканом, – хоть бы подул!
Чехов А. П., Моя жизнь, 1896.
– Да ведь со мною покупатель-то будет торговаться? – спросил старик, покачивая головой. – Ему тоже охота священный-то подешевле купить…
Горький Максим, Жизнь Клима Самгина, 1936.
– Стало, следствие начнется? – робко спросил Тарантьев. – Вот тут-то, кум, отделаться бы подешевле: ты уж, брат, выручи!
Гончаров И. А., Обломов, 1859.
При магазине была колбасная; чтобы иметь товар подешевле, хозяин заблаговременно большими партиями закупал кишки, и они гнили в бочках, распространяя ужасную вонь. По двору носилась злющая собака, овчарка Енотка, которая не выносила полицейских. Чуть увидит полицейского – бросается. И всякую собаку, забежавшую на двор, рвала в клочья.
Гиляровский В. А., Москва и москвичи, 1926.
В нужном месте уступай товар подешевле, чтобы к тебе привыкли, чтобы тебя ценили, но подозрений опасайся.
Горький Максим, Жизнь ненужного человека, 1907.
Не нужно-де заботиться об изящности стола, а наготовить чего-нибудь попроще и подешевле; все равно — гости не будут ничего кушать.
Квитка-Основьяненко Г. Ф., Пан Халявский, 1840.
Что нынче, так же, как издревле,
Хлопочут набирать учителей полки,
Числом поболее, ценою подешевле?
Грибоедов А. С., Горе от ума, 1824.
“Айда домой, Федор! – говорит, – лес первый сорт! нечего и смотреть больше! теперь только маклери, как бы подешевле нам этот лес купить!”
Салтыков-Щедрин М. Е., Благонамеренные речи, 1876.
Жених делал подарки Верочке: они делались через Марью Алексевну и, конечно, оставались у ней, подобно часам Анны Петровны, впрочем, не все; иные, которые подешевле, Марья Алексевна отдавала Верочке под именем вещей, оставшихся невыкупленными в залоге: надобно же было, чтобы жених видел хоть некоторые из своих вещей на невесте.
Чернышевский Н. Г., Что делать?, 1863.
Известно, что этот микадо (настоящий, законный государь, отодвинутый узурпаторами-наместниками, или сиогунами, на задний план) не может ни надеть два раза одного платья, ни дважды обедать на одной посуде. Все это каждый день меняется, и сиогун аккуратно поставляет ему обновки, но простые, подешевле.
Гончаров И. А., Фрегат «Паллада», 1857.
– Бог с тобой, – ответил Дыма все-таки шопотом, – если уже ты не можешь уступить подешевле. А только вот этому господину не покажется ли неприятно? Все-таки мы люди простого звания…
Короленко В. Г., Без языка, 1895.
Кабанова. Ну, ты не очень горло-то распускай! Ты найди подешевле меня! А я тебе дорога! Ступай своей дорогой, куда шел. Пойдем, Феклуша, домой. (Встает.)
Островский А. Н., Гроза, 1859.
Он прикинул еще раньше центральное положение, какое занимал Суслон в бассейне Ключевой, – со всех сторон близко, и хлеб сам придет. Было бы кому покупать. Этак, пожалуй, и Заполью плохо придется. Мысль о повороте торжка сильно волновала Михея Зотыча, потому что в этом заключалась смерть запольским толстосумам: копеечка с пуда подешевле от провоза – и конец. Вот этого-то он и не сказал тогда старику Луковникову.
Подешевле или по дешевле?
Даже если вы ничего никогда не продавали через интернет, всё же наверняка хоть раз, но приценивались к какой-нибудь вещи на популярных платформах. И, возможно, даже писали продавцу с вопросом, не продаст ли он товар подешевле? Но, собственно, грамотно ли вы задавали ему этот вопрос? Ведь даже если торговля и не экзамен, всё же с грамотным человеком общаться приятнее. Поэтому знать, как правильно пишется — подешевле или по дешевле — не будет лишним никогда. Возможно, и сэкономить получится.
Правописание слова
Главное затруднение в правописании этого слова — слитно или раздельно оно пишется. Поэтому сначала надо понять, что это за часть речи.
Зададим вопрос: «как? — подешевле». Попробуем изменить по числам, родам и времени:
- купит подешевле: буд. время, неопред.-личное;
- купила подешевле: прош. время, жен. род;
- покупают подешевле: наст. время, мн. число.
Как видим, форма слова не изменяется ни от времени, ни от числа и рода. В русском языке такие признаки имеет наречие. Следовательно, изучаемое нами слово — это наречие образа действия.
Произошло оно от наречия «дёшево», которое, в свою очередь, произошло от прилагательного «дешёвый». Соответственно, в прилагательном корень «-дёшев-», «-ый» — окончание. Наречие же образовано при помощи суффикса «-о-».
В свою очередь, при помощи суффикса «-л-» образована сравнительная степень наречия «дёшево» — «дешевле». Но что такое «по»? Это предлог или приставка?
- Во-первых, если бы «по» было предлогом, то между им и последующим словом можно было бы вставить другой слово без потери смысла, например, прилагательное: «по столу — по деревянному столу». В «подешевле» никакое слово вставить нельзя.
- Во-вторых, предлог «по» используется только перед существительными и местоимениями. А «дёшево» — это, как мы уже выяснили, наречие. Следовательно, предлогом в данном случае «по» быть не может. Это приставка. А приставки всегда пишутся слитно.
Наличие приставки «по» превращает литературное написание наречия «дешевле» в разговорное.
Между тем, в русском языке действует правило. Согласно ему наречия в сравнительной степени, образованные с помощью приставки «по», пишутся слитно.
Примеры предложений
- — Слишком дорогие помидоры у вас, хотелось бы купить чуть-чуть подешевле. Может уступите рублей девяносто или сто?
- Хотя Мария гордилась тем, что на последней распродаже ухватила моднейшее платье подешевле, её всё же гложил тот факт, что она снова спустила все свои деньги на одежду.
- Павел Петрович по-дружески сказал Федьке, племяннику, который решил обзавестись своим бизнесом: «Запомни. Товар, что подешевле, ставишь на самые дальние полки, а подороже — вперёд».
- Тетка Варьки с соседнего двора была уверена, что если брать продукты огромными пачками, то в итоге выходит подешевле, а она на этом экономит.
- А вы не продадите этот деревянный стол с необычными ножками подешевле? — поинтересовалась у консультанта бабушка в изысканной шёлковой блузе цвета фуксии.
Ошибочное написание
Неправильно писать раздельно и через дефис: «по дешевле», «по-дешевле». Также неверным будет написание «падешевле».
Синонимы слова
Дешевле, недорого, попроще, экономнее, меньшей цены, доступнее, даром.
Заключение
Итак, чтобы правильно написать подешевле, нужно запомнить, что это наречие, а наречия в сравнительной степени с приставкой «по» всегда пишутся слитно.
Правильно/неправильно пишется
(Пока оценок нет)
Как пишется: «по дешевле», «по-дешевле», «подешевле»? Как писать правильно?
Правильно писать ПОДЕШЕВЛЕ (слитно и без всяких там дефисов).
Наречие подешевле пишется слитно, так как образовано от наречия дешевле путем присоединения приставки по.
Наречия с приставкой по- пишутся через дефис, если оканчиваются на -ому, -ему, -ки, -ски, -ъи. Например: по-английски, по-птичьи. А слово подешевле имеет приставку по-, но оканчивается на -е, поэтому через дефис не пишется.
автор вопроса выбрал этот ответ лучшим
Я когда-то учился в школе. И хоть не блестал особым рвением к русскому языку, но все-таки знаю абсолютно точно то, что Слово подешевле пишется именно так и без всякой «-«. Другое дело было бы, если это было слово По- дешевому. Короче, все что кончается на — ому, — ки и — ему пишется через дефис.
Дешевле — это наречие.
А наречия, которые произошли от наречий при добавлении приставок, пишутся слитно.
Таким образом, правильно писать ПОДЕШЕВЛЕ
пишутся с приставкой по- через дефис:
наречия, у которых окончания -ему, -ому, -ски, -ьи, -цки; образованные от прилагательных.
Подешевле, подороже, поближе, подальше и т.д. — все эти слова пишутся слитно.
В этих словах -по- — приставка, а приставки всегда пишутся слитно.
А через дефис пишутся слова: по-моему, по-дурацки, по-братски и т.д.
Пишется вместе — ПОДЕШЕВЛЕ, потому что это наречие, которое образовано сочетанием предлога ПО и падежной формы короткого прилагательного дешев. Можно также привести такие примеры,как потихоньку, повеселей.
Наречие «подешевле» пишется слитно. Образовано из предлога «по» и слова «дешево». Можно сравнить со словами подороже, помедленнее, потихоньку.
Слово «подешевле» пишется слитно-это наречие.
Марьюшка Душка [33.6K]
Нужное Вам, и очень приятное покупателям слово «подешевле» является наречием, и писать его нужно одним словом. Здесь нет предлога ПО, потому что между ПО и Дешевле нельзя вставить другого слова (обычно прилагательного). Здесь не нужен дефис, потому что в русском языке существует специальное правило написания наречий с дефисом, и данное слово сюда не подпадает.
Из всех предложенных вариантов правильным будет «подешевле». Это слово отвечает на вопрос «как?» и является наречием. А если наречие начинается на «по» и заканчивается на «-ки», «-ему», «-ому», то после «по» ставится дефис. Примеры: по-татарски, по-старому. В ином случае пишем слитно. Примеры: подешевле, поновее, потруднее.
Пишется слитно, потому что во-первых, это наречие. Отвечает на вопрос как?.
По правилам наречия, которые начинаются с «по» и заканчиваются на -ому, -ему, -ки пишутся через дефис. Вот примеры слов по-простому, по-братски. Все остальные слова с приставкой «по» пишутся слитно
Так как словечко «подешевле» подешевле является наречием и при этом не оканчивается на такие суффиксы: -ому, -ему и -ки, то слово подешевле пишется слитно.
А если бы в слове присутствовали суффиксы про которые я раньше говорил, то было бы надобно писать через дефис.
я конечно к сожалению не учитель правописания но скажу что проверочное слово по написанию любого слова зависит от слова без приставки, если слово существует значит отдельно писать нужно, тоесть: «найти эту вещь дешевле возможно» «по дешевле»
Как правильно пишется слово «дешевле»
деше́вле, сравн. ст.
Источник: Орфографический академический ресурс «Академос» Института русского языка им. В.В. Виноградова РАН (словарная база 2020)
Делаем Карту слов лучше вместе
Привет! Меня зовут Лампобот, я компьютерная программа, которая помогает делать Карту слов. Я отлично умею считать, но пока плохо понимаю, как устроен ваш мир. Помоги мне разобраться!
Спасибо! Я стал чуточку лучше понимать мир эмоций.
Вопрос: подвезти — это что-то нейтральное, положительное или отрицательное?
Ассоциации к слову «дешевле»
Синонимы к слову «дешевле»
Предложения со словом «дешёвый»
- На самом деле, похоже, дело идёт к засилью всё более и более дешёвой рабочей силы, которой будут помогать довольно бестолковые роботы, и близко не оправдывающие поднятой вокруг них маркетинговой шумихи.
- Сперва они приноравливаются сбрасываться мелочёвкой и покупать дешёвое вино.
- Дрожжевая выпечка со всевозможными наинками экономит семейный бюджет, так как продукты для её приготовления стоят гораздо дешевле мяса, а сытости она даёт не меньше любого горячего блюда.
- (все предложения)
Цитаты из русской классики со словом «дешевле»
- Сделают ученое открытие, что от увеличения налога на соль она не подешевеет: начинают с благоговением повторять, что наука идет у нас вперед исполинскими шагами.
- В этих глазах светилось столько проснувшейся жадности поживиться чужим добром, захватить в свою долю дешевого товару, — благо никому запрету нет.
- — Ну, пожалуйста, не надо этого делать, — взмолился Берко, к имени которого теперь все приходилось прибавлять слово «мистер». — Мы уже скоро дойдем, уже совсем близко. А это они потому, что… как бы вам сказать… Им неприятно видеть таких очень лохматых, таких шорстких, таких небритых людей, как ваши милости. У меня есть тут поблизости цирюльник… Ну, он вас приведет в порядок за самую дешевую цену. Самый дешевый цирюльник в Нью-Йорке.
- (все цитаты из русской классики)
Значение слова «дешевле»
ДЕШЕ’ВЛЕ. Сравн. ст. к прил. дешёвый и к нареч. дёшево. (Толковый словарь Ушакова)
Поиск ответа
Всего найдено: 33
Добрый день!
Не подскажете, как правильно считаются абзацы…
1. Стороны договорились изложить абзац 1 п.4.1.2 в следующей редакции:
«4.1.2. Агентское вознаграждение Агента определено в твердой денежной сумме и составляет:
— с 01.07.2008 года и далее 750 000 (Семьсот пятьдесят тысяч) рублей 00 копеек за каждый месяц торговли.».
Все-таки изменения вносятся в 1й абзац или во 2й?
Спасибо.
Ответ справочной службы русского языка
Судя по тексту, речь о первом абзаце.
Добрый день, подскажите правильное написание суммы в тексте договора: «… обязан выплатить сумму в размере 900 рублей (девятьсот, девятисот или девятиста) рублей…»?
Спасибо!
Ответ справочной службы русского языка
Как правило: в размере 900 (Девятьсот) рублей.
Уважаемая Справка!Подскажите пожалуйста как правильно: сумма в размере 2 500 000,00 ( Два миллиона пятьсот тысяч) рублей 00 коп.Заранее спасибо.
Ответ справочной службы русского языка
Корректно: сумма в размере 2 500 000 ( Два миллиона пятьсот тысяч) рублей 00 коп.
Требуется ли в договоре (т. е. внутри развернутого предложения) писать число прописью с заглавной буквы: «Стоимость работ по настоящему договору составляет 500 (Пятьсот) рублей»?
Ответ справочной службы русского языка
Да, принято писать числительное с прописной буквы.
Здравствуйте, грамота!
Как правильно писать 100 (Сто) рублей, или 100 (сто) рублей.
Ответ справочной службы русского языка
Как правило, используются прописные буквы.
Подскажите, пожалуйста, какой вариант написания правильный:
1. Стоимость работ по договору составляет 10000 (десять тысяч) рублей 00 копеек или 2. Стоимость работ по договору составляет 10000 (Десять тысяч) рублей 00 копеек?
Ответ справочной службы русского языка
Как правило, используется второй вариант.
Подскажите, где правильно поставить закрывающуюся скобку:
Сторона 1 перечислила сумму в размере 403 736 20 (четыреста три тысячи семьсот тридцать шесть)? рублей 20 копеек)? в сроки,…
Ответ справочной службы русского языка
Корректно: …403 736 (четыреста три тысячи семьсот тридцать шесть) рублей 20 копеек…
Добрый день!
Подскажите, пожалуйста, правильно ли говорить так: по 21 (двадцати одному) рублю за литр; по 22 (двадцать два) рубля за литр… по 29 (двадцать девять) рублей за килограмм?
Спасибо!
Ответ справочной службы русского языка
Конструкция с дательным падежом является книжным вариантом: по двадцати одному рублю, по двадцати девяти рублей. Если в составном числительном имеются слова два, три, четыре, то все счетное сочетание ставится в форме родительного падежа: по двадцать два рубля.
Как правильно писать расшифровку суммы в скобках с большой или маленькой буквы? Например: 1) 10 000,00 (Десять тысяч рублей), 2) 10 000 (десять тысяч) рублей, 3) 10 000,00 (Десять тысяч) рублей ?
Ответ справочной службы русского языка
Как правило, используется третий вариант.
К оплате подлежит 5000 (П(п)ять тысяч) рублей. С прописной или строчной буквы нужно указывать расшифровку суммы?
Ответ справочной службы русского языка
Обычно сумму в скобках пишут с большой буквы.
Дорогая грамота! Предложение из банковского документа: «Стоимость составляет 300 000 (Триста тысяч) рублей. Я как корректор исправляю на (триста тысяч), но юрист уверяет, что первое слово числа, заключенного в скобки, должно писаться с заглавной буквы. Как правильно? Лебедева
Ответ справочной службы русского языка
В финансовых документах в таких случаях принято использовать прописную (большую) букву.
Как правильно писать сумму прописью в скобках после цифр? С большой буквы или с маленькой? Пример: 2000 (две тысячи) рублей — это правильно?
Ответ справочной службы русского языка
Обычно в документах сумму прописью пишут с большой буквы: _2000 (Две тысячи)_.
Как правильно оформляется в деловой корреспонденции написание цифр? Например, Было получено 20 000 (двадцать тысяч) рублей 13 копеек. Нужно ли расшифровывать копейки?
Ответ справочной службы русского языка
Обычно пишется: _Было получено 20 000 (Двадцать тысяч) рублей 13 копеек._
цена билета от ста пятидесяти до пятиста (пятисот) рублей. Как читать 500? И какое существует правило?
Ответ справочной службы русского языка
Верно: _до пятисот_.
Здравствуйте! Подскажите,пожалуйста,как правильно пишется расшифровка суммы, например: 200000.00 руб.(рублей)(двести тысяч рублей 00 копеек) или (Двести тысяч 00 рублей 00 коп.). Напишите, пожалуйста, правильный вариант. Спасибо. Лена.
Ответ справочной службы русского языка
Корректно: _(Двести тысяч) рублей 00 копеек_. Страницы: первая 1 3 последняя
Формы написания чисел в тексте документов
«Все должны до одного
Цифры знать до цифры пять –
Ну, хотя бы для того,
Чтоб отметки отличать»
В. Высоцкий
«Алиса в Стране Чудес»
Перефразируя слова известного поэта, можно сказать, что каждый должен знать не просто цифры, но и то, как правильно пишутся числа, состоящие из этих самых цифр и столь часто употребляемые в различных документах. Чтобы разобраться, когда и как пишутся числа в тексте отдельных документов, надо сначала понять, какие формы написания чисел в тексте используются.
Существуют три формы написания чисел в тексте:
- цифровая;
- буквенная (словесная);
- буквенно-цифровая.
В цифровой форме пишутся преимущественно количественные числительные, например, «Подтверждаем, что нашим предприятием было получено 3 тонны цемента».
В словесной форме пишутся все числа, с которых начинается предложение, особенно первое в абзаце, например: «Десять станков необходимо отправить в филиал предприятия «Экотехника» в г. Псков».
Буквенно-цифровая форма представления чисел предпочтительнее тогда, когда приводятся крупные круглые цифры. Например, 50 млрд рублей, 50 тыс. руб., 10 млн рублей прочитать легче, чем 50 000 000 000 рублей.
Арабские и римские цифры
При написании чисел используются арабские или римские цифры. Выбор того или иного вида цифр определяется главным образом традицией или величиной порядковых чисел. Согласитесь, что никто не будет оспаривать неудобство использования римских цифр при обозначении больших чисел.
В наше время в текстах документов используются, как правило, арабские цифры. Но и числительные, обозначаемые римскими цифрами, имеют место быть. Следует иметь ввиду, что римскими цифрами не обозначается множественное число.
Порядковые числительные, обозначаемые арабскими цифрами, пишутся с наращением: «80-е годы». Падежное окончание в порядковых числительных должно быть однобуквенным или двубуквенным.
Двубуквенные окончания используют, если последней букве числительного предшествует согласный звук. Например, 5-го, 5-му, 6-му.
При написании порядковых числительных гораздо реже могут использоваться римские цифры, которые в этом случае пишутся без наращения: «специалист II категории», «юрисконсульт I категории».
Сложные существительные и прилагательные, имеющие в своем составе числительные, пишутся следующим образом:
- 500-летие,
- 3-месячный срок,
- 10-процентный,
- 3-дневный.
Но все это касается правил русского языка, которые надо знать и помнить всегда при использовании чисел в тексте документа. Нас же интересует вопрос, в каких случаях и в каких документах сумма, написанная цифрами, требует ее последующего указания прописью. Это вопрос, можно сказать, исторический.
Впервые в мировой истории постановление о том, что во всех документах цифры должны писаться прописью, а не арабскими цифрами, было принято в 1299 году во Флоренции. Однако этот запрет на арабские цифры был наложен не только из-за того, что цифры легче исправить, чем слова, но и из-за того, что новые тогда для Европы арабские цифры многие жители рассматривали как подозрительную «арабскую магию».
Указание суммы прописью
В наше время использование расшифровки чисел необходимо для того, чтобы обезопасить себя от различных проблем, которые могут возникнуть по вине невнимательного исполнителя (просто ошибся) или «по вине» контрагента, который сознательно увеличил сумму договора путем приписки нескольких цифр к ранее указанной сумме. Что же касается такого «креативного творчества» в договорах, то следует помнить, что договор – это палка о двух концах, которая может больно ударить любую из сторон. Поэтому вопрос о том, нужно ли прописывать суммы прописью в договорах, доверенностях, письмах, имеющих отношение к перечислению денежных средств, стоять не должен. А вот разобраться с тем, как правильно прописывать эти суммы, стоит. При этом Гражданский кодекс РФ не содержит никаких ссылок на то, как эти суммы должны прописываться в договорах, доверенностях.
Сначала остановимся на бухгалтерских документах. Здесь все более или менее понятно. Как правило, основная масса документов, которые приходится заполнять сотрудникам, является первичными учетными документами. Правила работы с ними регламентируются Федеральным законом от 21.11.1996 г. № 129-ФЗ «О бухгалтерском учете». Первичные учетные документы делятся на:
- документы, формы которых утверждены постановлениями Госкомстата РФ;
- на документы, формы которых не утверждены, но тогда они в обязательном порядке должны содержать необходимый минимум реквизитов, указанных в законе о бухгалтерском учете. Один из обязательных реквизитов таких документов – измерители хозяйственной операции в натуральном выражении и денежном выражении. При этом закон не содержит явной ссылки на необходимость расшифровки денежного выражения.
Многие утвержденные формы первичных учетных документов содержат не только строки с указанием сумм, но и строки для их расшифровки прописью. В соответствии с постановлением Госкомстата РФ от 24.03.1999 г. № 20 «Об утверждении порядка применения унифицированных форм первичной учетной документации» удаление отдельных реквизитов из унифицированных форм не допускается. А это означает, что заполнение реквизитов по указанию сумм и их расшифровка являются обязательными. Порядок заполнения данных реквизитов не установлен. Хотя в бухгалтерских документах он практически не вызывает затруднений.
Анализируя формы утвержденных первичных учетных документов, можно сделать вывод о том, что в тех документах, где суммы необходимо прописывать, это делается в следующем порядке (см. Пример 1):
- указывается сумма в цифровом выражении,
- а затем данная сумма повторяется прописью, при этом копейки обозначаются цифрами.
Мнение
С.Ю. Козлова, ведущий юрист ОАО «Оптима иКСчейндж Сервисез» (OXS):
Хотя ныне действующий закон от 21.11.1996 г. № 129-ФЗ «О бухгалтерском учете» и был принят вслед за Гражданским кодексом, с момента его вступления в силу прошло почти 11 лет. За это время российская экономика изменилась коренным образом.
Благодаря внесению соответствующих изменений в законодательные акты появились новые субъекты бухгалтерского учета (адвокаты, осуществляющие адвокатскую деятельность в адвокатском кабинете), расширился круг органов, уполномоченных осуществлять регулирование бухгалтерского учета. Последнее обстоятельство, в свою очередь, явилось следствием ослабления влияния государства на экономику страны и усиления экономической независимости субъектов предпринимательства.
И, наконец, немаловажную роль стало играть и то, что Россия, желая войти в качестве равноправного участника в мировое экономическое сообщество, осуществляет постепенный переход к ведению бухгалтерской и финансовой отчетности в соответствии с международными стандартами (МСФО, US GAAP). Все это нашло свое отражение в проекте нового закона «Об официальном бухгалтерском учете», который находится на рассмотрении в Госдуме.
Но сейчас применительно к рассматриваемой нами теме нам будет интересно одно существенное изменение, которое коснулось первичных учетных документов (т.н. «первички»).
Проект закона возлагает на руководителя организации обязанность по утверждению форм первичных учетных документов. Утверждение осуществляется по представлению лица, на которое возложено ведение бухгалтерского учета.
В настоящий момент формы первичных учетных документов содержатся в альбомах унифицированных форм первичной учетной документации, которые в соответствии с постановлением Госкомстата РФ от 29.05.1998 г. № 57а и Минфина от 18.06.1998 г. № 27н подлежат введению во всех организациях, осуществляющих деятельность на территории нашей страны. Поэтому сейчас экономический субъект вправе утверждать лишь формы тех первичных учетных документов, которые отсутствуют в альбомах унифицированных форм.
По всей видимости, принятие нового закона предполагает отказ от применения унифицированных форм. Каждый экономический субъект будет вправе утверждать формы первичных учетных документов, необходимых для ведения бухгалтерского учета в этом конкретном экономическом субъекте. Непременным условием утверждения и дальнейшего использования таких форм является наличие обязательных реквизитов, перечень которых в целом соответствует содержащимся в пункте 2 статьи 9 действующего закона «О бухгалтерском учете».
При этом в именительном падеже прописью указывается только та часть суммы, которая выражена в рублях. Во избежание приписок первое слово необходимо начинать с большой буквы, а в соответствии с п. 2.9 «Положения о документах и документообороте бухгалтерских документов», утвержденных Министерством финансов СССР от 29.07.1983 г.
№ 105 «свободные строки в первичных документах подлежат обязательному прочерку».
Пример 1
Пример 2
Не только в бухгалтерских документах, но и в договорах, доверенностях при составлении указываются суммы, которые необходимо повторять прописью.
Порядок расшифровки суммы договора или суммы, указанной в доверенности, как мы отмечали выше, не регламентируется Гражданским кодексом РФ. Но принцип написания сумм прописью остается общим для всех документов: сначала указываем сумму в цифровым способом, а затем – прописью в именительном падеже с большой буквы. Но и здесь возможны вариации:
- Исходя из практики делового оборота можно рекомендовать следующий наиболее распространенный способ, при котором сначала полностью прописывается сумма в цифровом выражении, включая рубли и копейки, а затем она повторяется, но уже прописью (см. Пример 1).
- Но на практике встречается и другой способ. Сначала прописывается сумма, которая отражает рубли, в цифровом выражении и прописью в скобках, а затем копейки указываются только один раз в цифровом выражении:
Пример 3
Стоимость обслуживания в августе 2007 г. составляет 1 345 586 (Один миллион триста сорок пять тысяч пятьсот восемьдесят шесть) руб. 34 коп., в том числе НДС 18 % в размере 205 258 (Двести пять тысяч двести пятьдесят восемь) руб. 93 коп.
Пример 4
Кредитор обязуется открыть заемщику возобновляемую кредитную линию с лимитом в сумме 100 000 000 (Сто миллионов) рублей 00 копеек для расчетов с поставщиками и подрядчиками по оплате сырья, упаковки и услуг на срок по 10 марта 2008 года под 11,5 (Одиннадцать целых пять десятых) процентов годовых, а заемщик обязуется возвратить кредитору полученный кредит и уплатить проценты за пользование им в размере, в сроки и на условиях настоящего Договора.
В договорах вы можете встретить еще один способ расшифровки суммы, например, «17 363,00 (Семнадцать тысяч триста шестьдесят три рубля 00 копеек)». С точки зрения логики здесь есть противоречие. Вторая часть (расшифровка) должна полностью соответствовать первой части (цифровому выражению). В данном примере в первой части отсутствует ссылка на валюту, тогда почему при расшифровке указаны именно рубли, а, к примеру, не доллары США или евро? Добавив в первую часть слово «руб.», мы получим модификацию первого из перечисленных допустимых вариантов: «17 363,00 руб. (Семнадцать тысяч триста шестьдесят три рубля 00 копеек)».
Использовать ли слова «рубли» и «копейки» или употреблять их сокращенные варианты («руб.», «коп.»), вы можете решить для себя самостоятельно. Принципиального значения это не имеет. Главное, чтобы было единообразие: указав слово «рубли» полностью, аналогично поступите и со словом «копейки». Причем способы указания копеек (центов, евроцентов) тоже могут быть разными, что особенно характерно для международных контрактов.
Пример 5
Общая сумма контракта составляет 312 018,20 долларов США (Триста двенадцать тысяч восемнадцать долларов США двадцать центов США).
Пример 6
Общая сумма контракта составляет 116 121, 60 Евро (Сто шестнадцать тысяч сто двадцать один Евро 60 Евроцентов).
Пример 7
Общая сумма контракта составляет 14 284,56 (Четырнадцать тысяч двести восемьдесят четыре 56/100) Евро.
Пример 8
При этом хотелось бы обратить внимание читателей на то, что использовать можно любой из перечисленных способов расшифровки сумм в договоре, доверенности, письме или другом документе (кроме бухгалтерских). Какой из них выбрать, вы можете определить сами, т.к. законодательно никакой из этих способов не закреплен. Самое главное, чтобы цифровое выражение суммы соответствовало тому, что указано прописью.
Если все-таки организация хочет ввести единообразие в порядок написания сумм в различных документах, то это можно закрепить в Инструкции по делопроизводству, где, например, обычно прописывается порядок написания даты документа. При этом следует помнить, что Инструкция по делопроизводству является локальным нормативным актом организации, и, следовательно, обязать контрагента по договору прописать сумму так, как это закреплено в вашей Инструкции по делопроизводству, вы не сможете. Здесь важно, чтобы стороны договорились о любом правильном написании чисел и их расшифровке.
Мы рассмотрели варианты, когда сумма в различных документах указывается четко. Но на практике очень часто при выдаче доверенностей на право подписания определенных договоров указывается предел суммы, свыше которого доверяемый не может заключать договоры. В этом случае расшифровка суммы пишется в родительном падеже, т.к. она следует за словами «не более», «не менее». Например, «не более 2 000 000 (Двух миллионов) рублей».
Пример 9
Аналогичная ситуация возникает при расшифровке прописью иных чисел, например, количества банковских дней или объема авторских листов (сумма прописью подлежит склонению):
Пример 10
Отгрузка товара осуществляется по истечении 5 (Пяти) банковских дней с даты зачисления оплаты по договору на расчетный счет поставщика.
Пример 11
Материал предоставляется в объеме не менее 2,5 (Двух с половиной) авторских листов.
* * *
Таким образом, анализ возможных вариантов расшифровки чисел прописью позволяет сделать вывод о том, что на сегодня этот вопрос законодательно не урегулирован. А раз так, то можно рекомендовать разработчикам нового ГОСТа по делопроизводству включить такой раздел в новую редакцию ГОСТа и попытаться расставить все точки над «и», чтобы каждый из нас, подобно Алисе из страны Чудес, мог сказать:
«До мильона далеко,
Но сначала нужно знать,
То, что просто и легко, –
Раз, два, три, четыре, пять».
А пока автор статьи надеется, что рассмотренные примеры написания чисел, основанные на многолетнем опыте работы с документами и практике делового оборота, помогут многим сотрудникам справиться с этой задачей.
Сумма прописью онлайн
4,3 средняя
из 294 оценок
Бесплатный калькулятор «Сумма прописью онлайн” поможет быстро перевести сумму, записанную цифрами, в сумму прописью по всем правилам орфографии. Правописание числительных — обширная тема с массой нюансов, не все помнят ее со школы. Наш простой калькулятор покажет суммы прописью на русском языке без ошибок. Вам нужно только ввести цифровое значение в поле.
При заполнении финансовых, бухгалтерских и налоговых документов нужно написать денежный показатель цифрами и продублировать его прописью — то есть, прописать словами. Это делается в зарплатных ведомостях, договорах, кассовых ордерах, применяется для банковского чека — деньги фигурируют почти во всех бумагах. Основная цель прописывания сумм — желание избежать подделки. Внешний вид цифр легко изменить, а вот словесное написание исправить трудно.
Перевод цифровых значений в словесные — утомительное занятие. Если вам приходится заполнять много документов, то возрастает и риск ошибки. Чтобы легко и бесплатно перевести сумму в правильный прописной вариант, воспользуйтесь нашим калькулятором.
Как работает калькулятор «Сумма прописью онлайн»
Введите числовой вариант суммы в рублях в поле калькулятора. Программа отреагирует на введение числа автоматически и предложит словесную формулировку суммы. Она будет писаться ниже числового поля сразу же после ввода цифр. Дополнительно ничего нажимать не нужно.
Прописная расшифровка появляется именно в том варианте, который принят для финансовых документов: рубли указываются прописью, копейки — цифрами, это правило. Сумма пишется с заглавной буквы, значение суммы в рублях и копейках не разделяется запятой или другим знаком препинания (точка, скобка). Например: «Двадцать тысяч пятьсот один рубль 51 копейка”.
Если нужно указать число копеек в сумме, пишите их после запятой или точки в составе числа. Пробел для этой цели использовать не удастся. Например: «20500,56” или «346.5”.
Если сумма целая, без копеек, пишите число без запятой и нулевых показателей после нее. Например: «3000000”. Калькулятор все поймет сам и предложит прописной вариант суммы с дополнением: «00 копеек”. Но и указание суммы в виде десятичной дроби с нулевыми значениями после запятой тоже допустимо. Например: «100,00”. Третий знак после запятой (точки) поставить не удастся.
Будьте внимательны, прописывая большие числа, особенно с несколькими нулями подряд.
Возможно, вам пригодятся другие онлайн-калькуляторы
Расчет пособия по временной нетрудоспособности
Расчет отпускных по нормам законодательства
Попробуйте Контур.Бухгалтерию
Удобный расчет зарплаты, простое ведение бухгалтерии, легкая подготовка
и отправка отчетности через интернет.












