Можно ли склонять слово бариста, как правильно писать капучино и где нужно ставить ударение в слове латте?
Каждый из нас холодным вечером любит согреться чашечкой ароматного айриш-кофе, а в летний зной – охладиться кофе-глясе. Приятная обстановка небольшого кафе лишь способствует поднятию настроения, но… Часто, заглянув в меню, мы стесняемся сделать заказ, поскольку не знаем, как правильно произносятся многие из позиций меню. Чтобы вы чувствовали себя уверенно и знали правильное произношение любимого напитка, предлагаем вам небольшую памятку. Итак…
Капучино – это слово пишется без двойных букв. Поэтому такое правописание, как «капуччино», «каппучино», «каппуччино» является неверным. Заметили подобное в меню? Можете смело сообщить администратору о наличии ошибки.
Латте – ударение в этом слове правильно ставить на первый слог, т.е. «лАтте». В данном случае работает правило языка «родителя». Поскольку данное слово имеет итальянское происхождение, а в Италии его произносят с ударением на первый слог – правильно произносить латте именно так, как это название произносится на языке-источнике.
Тирамису – ударение в этом слове нужно ставить на последний слог, о чем говорит орфографический словарь. Слово также имеет итальянские корни и состоит из трех слов: tira mi su. В дословном переводе название лакомства звучит, как «тяни меня вверх» (художественная интерпретация – «вознеси меня»). Запомнить правильное произношение очень просто – нужно четко понимать, что «су» является самостоятельным словом. Этот десерт готовят из следующих ингредиентов: сыр маскарпоне, сахар, кофе, печенье савоярди и яйца.
Глясе – слово пишется с одной буквой «с», имеет французское происхождение (glacé, что обозначает «ледяной» или «замороженный»). В результате мы получили кофе с мороженым – превосходный освежающий напиток.
Бариста – человек, специализирующийся на приготовлении кофе. Такие люди в совершенстве владеют искусством латте-арт и являются кофейными сомелье. Поскольку это слово мужского рода и не может склоняться, то по отношению к мужчине и женщине нужно обращаться не иначе как бариста.
Кофе – несмотря на всю очевидность, многие постоянно причисляют это название к среднему роду. Запомните, что кофе – это название мужского рода. Поэтому если вы слышите, что кофе относят к существительному среднего рода, можете смело делать замечание.
Познакомившись поближе с кофейной «кухней», можете смело отправляться в ближайшее кафе. Попросите принести за ваш столик ароматный кофе-лАтте, а в качестве десерта – воздушный тирамисУ.
Как правильно написать доклад
Доклад – небольшая научно-исследовательская работа, посвященная одной узкой теме. Он может быть сделан как в письменной, так и в устной форме. Скорее всего, студенту придется делать его в обеих формах.
Часто путают доклад с рефератом. В чем-то эти «жанры» близки друг другу, часто реферат называют «докладом», но если вы не видите разницы, то рискуете проделать лишнюю работу и написать 30-40 страниц вместо 5-6.
Ключевое отличие доклада от реферата – в его цели. Доклад призван информировать аудиторию. Вы вправе просто подготовить план и, изучив информацию по теме, выступить перед своими сокурсниками и преподавателем. Ваше выступление может длиться 5-10 минут – большего обычно и не требуется.
Тем не менее, преподаватели нередко требуют студентов оформлять доклад в письменном виде. И с этим могут возникнуть проблемы. Со школьной скамьи мы привыкли к стандартной для небольших научных работ структуре:
— Титульный лист;
— Оглавление;
— Введение;
— Основная часть;
— Заключение;
— Список использованной литературы (библиография).
Эта структура подойдет и для доклада, и для реферата. Вот только в первом случае основная часть будет значительно короче (5-6 страниц против 30-40). Соответственно, нет смысла делать большие введение и заключение.
Как правильно написать доклад?
Подробнее о том, как оформить доклад, мы поговорим чуть позже. Сейчас – о самой работе, которую вам предстоит сделать. Условно можно поделить ее на четыре этапа:Этап первый. Выбор темы
Здесь все просто. Если преподаватель дал список тем, выбирайте ту, что понравится больше всего. Если вам предложили придумать тему самостоятельно (например, в рамках определенной сферы), берите ту, что вам по душе. Даже в скучной дисциплине есть что-то интересное. И всегда можно связать одну дисциплину с другой. Например, любитель истории при подготовке доклада по юриспруденции, может рассмотреть историю развития права. А музыкант, ставший студентом медицинского вуза, может рассмотреть вопрос влияния музыки на здоровье. Вы вольны выбрать любую тему, если это позволяет преподаватель.
Этап второй. Поиск и изучение литературы
С интернетом поиск литературы по теме стал намного проще. Уже не нужно часами копаться в картотеке и перелопачивать сотни книг. Достаточно сделать запрос в поисковике. Увы, в сети много «булщита» (то есть абсолютно бесполезной, часто ложной информации). Однозначно не стоит пользоваться обычными сайтами, банками рефератов и докладов и другими подобными ресурсами. С «Википедией» нужно обращаться аккуратно, перепроверяя информацию. Наилучшим источником остаются научные труды. Найти их можно и в сети, например, с помощью Google Академии. Если выложены только ссылки на работы, вам придется идти в библиотеку.
Обязательно сохраните не только названия и данные авторов научных работ, но и год издания и название издательств, в которых опубликованы труды. Укажите страницы, если работа размещена в сборнике
Этап третий. Написание основной части
Этот этап поделим на три части.
Первая – подготовка тезисов. Если вы уже писали эссе, вы знаете, как это делается. Достаточно одного тезиса – вокруг него будет строиться вся работа.
Обратите внимание! В тезисе, как и во всем докладе, не должно быть субъективного мнения – вашего или чужого. Это главное отличие доклада от эссе. Здесь важна именно объективность.
Вторая часть – подготовка плана (структуры) работы. Структура зависит от выбранной вами темы. Она может быть линейной или разветвленной, может идти от тезиса к аргументации и наоборот, может иметь описательный или аналитический характер.
Третья часть – собственно работа над текстом. Правил написания доклада совсем немного, о них поговорим ниже.
Этап четвертый. Работа над введением и заключением
Введение и заключение доклада типичны для любой студенческой работы. Во введении формулируем проблему (тезис), даем обоснование выбору темы (опционально), оцениваем актуальность, указываем цель и задачи доклада, характеризуем литературу, которую использовали.
В заключении делаем выводы, обобщаем изложенную в основной части информацию.
Вот, собственно, и все. Остается только оформить титульный лист и список литературы. Перед тем, как распечатать доклад, не поленитесь перечитать его еще раз, а лучше – проверить в сервисах на уникальность и ошибки.
Как написать доклад на «отлично»?
Доклад способен подготовить любой студент. Но не каждому поставят «отлично», и не каждого запомнят. Чтобы вашу работу отметили не только другие студенты, но и преподаватели, руководствуйтесь тремя правилами написания доклада:
- Уникальность. Не копируйте фразы или абзацы текста. Ни из интернета, ни из библиотечных книг. Проверить уникальность несложно, и обмануть даже молодого и неопытного преподавателя вы не сможете.
- Грамотность. Вас должны интересовать не только орфографические и пунктуационные ошибки, но и ошибки фактические. Впрочем, таковых и не будет, если вы пользуетесь научной литературой и указываете ее в библиографии.
- Академический стиль. Практически все виды студенческих работ пишутся именно в академическом стиле. Вы вправе использовать сложноподчиненные предложения, деепричастные и причастные обороты, термины и многосложные слова. Однако важно, чтобы предложения были построены правильно, а термины употреблены к месту. Не усложняйте текст намеренно, если у вас нет опыта.
Ну и самое главное. Вы можете просто заказать доклад. Студлансер найдет литературу по теме, подготовит и оформит текст. В этом нет ничего криминального – основную часть работы (а именно, выступление перед аудиторией) вам в любом случае придется проделать самостоятельно. Обязательно подготовьте текст выступления. Заучивать не нужно – будет достаточно простого пересказа.
Гостинная или гостиная как правильно пишется
Тот, кто интересуется строительной тематикой, много читает материалов о рынке недвижимости, дизайне интерьеров, да и просто человек внимательный, мог отметить, что сегодня наряду со словом «гостиная» часто можно встретить и вариант «гостинная». В поисковых системах ответы на запрос с первым словом встречаются чаще, но и сайты со второй версией бывают нередки. Так как же правильно: гостиная или гостинная, будем разбираться.
Гостиная комната: быть или не быть
В русском языке сочетание слов «гостиная комната» практически не употребляется, подобно тому, как не говорят и «масло масляное». Данные выражения в некоторой степени являются тавтологией или необоснованным повторением одних и тех же слов, однокоренных или близких по смыслу.
Интерьер гостиной
Первоначально словосочетание «гостиная комната» существовало и в разговорной речи, и в литературных произведениях. Сегодня так говорить не принято в связи с тем, что гостиная — это та же самая комната. Зачем тогда называть один и тот же предмет дважды? Данное выражение потеряло существительное, а прилагательное «гостиная» приобрело признаки имени существительного. Поэтому на вопрос, как пишется выражение «гостиная комната», отвечаем: никак. Только по отдельности: или говорим о модной стильной гостиной, или о центральной комнате, являющейся главной в квартире.
Уютная гостиная в бежевых тонах
Все дело в суффиксе
Само прилагательное «гостиная» образовалось от корня «гость» с добавлением суффикса -ин-, такой способ словообразования носит название суффиксального. Произошедшая позже субстантивация (что с латыни переводится как имя существительное) отнесла прилагательное к разряду существительных, но дополнительного суффикса -н- в слове не прибавилось.
По такому же образу были созданы слова:
- гость — гостиный двор;
- лось — лосиный рог;
- сыч — сычиный крик и другие.
Мебель для современной гостиной
Существует и правило, согласно которому прилагательное, образованное от имени существительного с прибавлением суффикса -ин-, а также -ан-, -ян-, пишется с одной буквой Н, относящейся к суффиксу. Согласно ему рассматривается только вариант ГОСТИНАЯ. К подобным словам относятся и прилагательные, получившие статус самостоятельных существительных, и обозначающие различные помещения: процедурная, котельная, приемная и другие.
Гостиная в загородном доме
Сторонники «гостинной»
Как видно из предыдущей части, корень ГОСТЬ и суффикс -ин- образовали новое слово «гостиная», которое и является правильным вариантом употребления. В данном виде слово встречается и во многих известных орфографических словарях.
Важно! Если говорить о слове «гостинная», написанного с двумя Н, то такого слова в русском языке нет.
Однако, в последние годы оно было внесено в «Орфографический словарь» Ильи Юрьевича Сазонова за 2002 год. В русской литературе подобный вариант встречается единственный раз в рассказе А. Чехова «Юморески»: «Кузина затеяла гостинный разговор». В то далекое время изредка слово так и писалось. Думается, что Антон Павлович намеренно в своих рассказах играл словами, чтобы показывать комизм изображаемых ситуаций.
Сторонником слова «гостинная» с двойной буквой НН является и такой многоуважаемый портал, как Грамота.ру, приводящий свои доводы на основе «орфографического словаря» Владимира Владимировича Лопатина, известного российского лингвиста. Подтверждается это написание правилом, по которому удвоенное НН пишется на стыке двух частей: производящей основы и суффикса, когда основа заканчивается, а суффикс начинается с одной согласной, в данном случае с буквы Н. Например:
- длинный — от слова длина;
- карманный — от слова карман;
- гостинный — от слова гостиная.
Свою точку зрения на сайте обосновывают тем, что двойная НН употребляется в прилагательном, стоящем в паре с существительным, которое обозначает принадлежность, отношение к данному конкретному месту: гостинная мебель, гостинные разговоры.
Думается, еще много лет будут ломаться копья при ответе на вопрос: как писать правильно гостиная или гостинная. Сторонники правильного литературного языка будут доказывать, что нельзя трогать великий и могучий, а радетели всего нового будут доказывать, что язык такая же живая субстанция, чутко реагирующая на происходящие изменения. Но на сегодняшний день во всех словосочетаниях правильно писать «гостиная» с одной буквой Н.
Как переводить менеджер, директор, специалист на английский?
Перевести названия должности — любопытная задача. Особенно если учитывать, что варианты перевода нужно подбирать в зависимости от организационной структуры.
Организационно-правовые формы компаний, даже если и называются одинаково, имеют отличия в разных юрисдикциях. Следовательно, названия должностей относятся к реалиям (неотъемлемы от культуры) и переводятся с учетом особенностей страны, в которой компания ведет работу.
Более того, так как компании частные и никакой стандартизации в этой области нет, каждая компания создает свою собственную структуру, со своими названиями, которые, по мнению владельца или совета директоров, наилучшим образом отражают функциональность должности (или больше всего льстят тому, кто эту должность занимает).
Типичная организационная структура небольшой компании в России и в англоязычных странах выглядит так
Россия
Генеральный директор
Директор (Начальник) отдела
Менеджер (Специалист)
США (и Великобритания*)
CEO
Director или Vice President (VP)
Regular employees (supervisors, specialists, representatives, associates, clerks)
*— отличия между странами в иерархии минимальны, но могут отличаться названия должностей.
Вероятно, вы уже заметили разницу, но давайте рассмотрим все должности по порядку.
Генеральный директор — General Director или CEO?
Генеральный директор американской или крупной международной компании, как правило, именуется Chief Executive Officer (CEO). В Великобритании используется его аналог Managing Director. Director General используется для обозначения генерального директора в ряде других стран, например, в Испании. А для России уже устоялся термин General Director — именно этот вариант перевода считается самым адекватным.
Что делать с другими «директорами» (по закупкам, по продажам и так далее)?
Если в компании, кроме генерального директора, есть еще другие директора, то их можно смело переводить как Director. Это адекватный перевод, такие структуры компаний встречаются и в англоговорящих странах. Но в США, например, на подобной позиции часто можно встретить Vice President (VP), а вот директор филиала, это, как правило, Branch Manager.
Комментирует носитель американского варианта английского языка:
Если компания достаточного размера, чтобы в ней были подразделения (divisions), а не только отделы, глава подразделения обычно называется Director или Vice President. Директор филиала, действительно, – Branch Manager, а вот с направлениями совсем по-разному: от Team Lead до VP, в зависимости от размера компании и мнения ее владельца/совета директоров по вопросу.
Хорошо, а «руководитель», «начальник» и «заведующий» переводятся по-разному?
Как правило, эти три термина взаимозаменяемы. Здесь речь чаще всего идет об отделах и подразделениях компании, поэтому адекватный перевод — Manager. Но все, как всегда, зависит от контекста: подходящими по смыслу могут быть и Head, и Direсtor, и Manager, и даже Leader.
Если термин “руководитель” используется в значении “директор компании” (так бывает в некоторых справках), лучше перевести его как Company Director.
А как быть с «заместителем директора»?
Говоря о должностях всевозможных заместителей, люди чаще всего выбирают между «Deputy» и «Vice». Выяснилось, что даже носители не всегда чувствуют разницу между ними и порой спрашивают о точном значении этих слов. Поэтому нам пришлось провести небольшое исследование, и вот что выяснилось:
- Deputy Х – сотрудник, назначаемый должностным лицом Х, которому Х может передавать свою власть и свои полномочия. Таких сотрудников в компании может быть много.
- Vice Х – сотрудник, чаще всего избираемый советом директоров, имеющий свои собственные обязанности и являющийся вторым по старшинству сотрудником компании. Таких сотрудников, как правило, немного.
Таким образом, логичнее всего называть заместителя словом Deputy. Соответственно, чтобы перевести название такой должности, достаточно добавить к должности директора слово Deputy.
Как переводить ИО и ВРИО?
Кроме заместителей есть еще сотрудники, «исполняющие обязанности». В английском есть два варианта: «Interim» и «Acting».
- Interim X – сотрудник одинакового с Х ранга, временного замещающий освобожденного от должностных обязанностей Х. Часто таких сотрудников нанимают специально для замещающей работы на должности, они получают все полномочия Х, и впоследствии им может быть предложено занять должность Х на постоянной основе.
- Acting X – сотрудник более низкого по отношению к Х ранга, временно замещающий Х, находящегося в отпуске/командировке/на больничном и т.д. Чаще всего, такие сотрудники не получают всех полномочий Х, а только самые необходимые.
Некоторые предлагают переводить ИО как acting, а ВРИО как interim. Однако однозначно сопоставить два русских термина с двумя английскими не представляется возможным. Почему? Потому что для этого нужно найти однозначные определения ИО и ВРИО и четко понять разницу между ними, тогда как эти понятия не прописаны в ТК РФ и их толкования разнятся даже на сайтах, посвященных юридическим и кадровым вопросам. Чаще всего путаница возникает в части совмещения текущей и занимаемой должностей, и на разных сайтах дается разная информация о том, кто же все-таки совмещает свою должность с замещаемой, а кто полностью переходит на последнюю: ИО или ВРИО.
Поэтому для перевода на английский язык часто достаточно ориентироваться на определения acting/interim и выбирать нужный термин. Более того, на практике acting встречается чаще.
Ну вот с менеджером точно все просто, есть же прямой эквивалент (на самом деле, нет)
В мировой практике Manager — это руководитель младшего звена (менеджер по проектам). В русском языке и в рамках реалий нашей страны есть описательный термин «топ-менеджер», который на английский передать сложно. Все же обычно руководителей высшего звена, которые в иерархии идут сразу после владельца или совета директоров называют Vice President, Director, Head of Department.
Также в России термин «менеджер» часто применяют для обозначения обычных сотрудников умственного труда, которые управленцами не являются. В англоязычной традиции таким должностям обычно соответствует сlerk или associate. Но часто бывает так, что «менеджер» используется и в традиционном понимании, чтобы обозначить людей с управленческими функциями. Поэтому при переводе мы исходим из описания должностных обязанностей в резюме или уточняем вопрос у клиента.
Пожалуй, самый яркий пример — это отделы продаж в русских компаниях, где абсолютно всех сотрудников отдела называют менеджерами по продажам. Так уж сложилось. Поэтому при переводе лучше уточнить, был ли на этой должности кто-то в подчинении. Если нет, то лучше перевести как sales representative. Если был, то можно переводить как sales manager. руководитель бюро Андрей Гук
А «специалист» и «сотрудник»?
Здесь с переводом сложнее. Перевод слов «специалист» и «сотрудник» очень сильно зависит от контекста. В основном эти должности можно перевести как specialist или professional, но иногда для сотрудников государственных органов или вообще всех тех, кто связан с обработкой и выдачей документов, подойдет officer или controller (например, HR officer — сотрудник отдела кадров).
А иногда лучшим выходом будет вообще опустить термин и оставить только вид деятельности. Хороший пример: специалист по аналитике данных — Data Analyst.
Для вашего удобства мы подготовили сводную таблицу с нашими вариантами перевода должностей. Таблица пополняется.
Директор
Должность | Перевод на английский |
---|---|
Административный директор | Administrative Director |
Арт-директор | Art Director |
Генеральный директор | CEO, President или General Director |
Директор отдела | Head of Department (часто Vice President; но если речь идет о большом магазине с отделами, то Department Manager), |
Директор магазина | Store Manager |
Директор по безопасности | Security Director (или Vice President of Security) |
Директор по закупкам | Procurement Director (или Vice President of Procurement) |
Директор по качеству | Quality Director |
Директор по логистике | Director of Logistics (или Vice President of Logistics) |
Директор по маркетингу | Marketing Director (или Vice President of Marketing) |
Директор по персоналу | HR Director |
Директор по продажам | Sales Director (или Vice President of Sales) |
Директор по производству | Chief Operations Officer или COO (именно так чаще всего, но можно и Operations Director, а также Vice President of Operations) |
Директор по развитию | Development Director (или Vice President of Development) |
Директор по экономике | Director of Economic Development |
Директор проектов | Project Manager (или Head of Projects, Project Director встречается редко) |
Директор направления | Business Unit Director |
Директор территории | Area Director |
Директор филиала | Branch Manager |
Директор школы | School Principal |
Исполнительный директор | Executive Director |
ИТ директор | CIO или IT Director |
Коммерческий директор | CCO или Commercial Director |
Креативный директор | Chief Creative Officer |
Операционный директор | Operations Director |
Технический директор | Technical Director |
Управляющий директор | Managing Director (или Vice President of Operations) |
Финансовый директор | Chief Financial Officer или CFO (реже — Financial Director и Vice President of Finance Department) |
Руководитель
Должность | Перевод на английский |
---|---|
Руководитель группы | Team Lead |
Руководитель компании | CEO, President или даже Owner (если владелец один) |
Менеджер
Должность | Перевод на английский |
---|---|
Административный менеджер | Administrative Manager |
Бренд-менеджер | Brand Manager |
Ведущий менеджер | Senior Manager |
Главный менеджер | Senior Manager |
Контент-менеджер | Content Manager |
Менеджер | Manager (если должность руководящая) или Representative (если должность не руководящая) |
Менеджер по закупкам | Procurement Specialist (если в компании нет других менеджеров по закупкам, можно Procurement Director, потому что Procurement Manager почти не встречается) |
Менеджер по ключевым клиентам | Key Account Manager |
Менеджер по логистике | Logistics Manager |
Менеджер по маркетингу | Marketing Manager |
Менеджер по персоналу | HR Manager |
Менеджер по продажам | Sales Manager |
Менеджер по работе с клиентами | Customer Support Manager |
Менеджер по развитию | Development Manager |
Менеджер по развитию бизнеса | Business Development Manager (хотя, например, в США это довольно редкая должность) |
Менеджер по рекламе | Advertising Manager |
Менеджер по связям с общественностью | PR Manager |
Менеджер по туризму | Tourism Manager |
Менеджер проекта | Project Manager |
Офис-менеджер | Office Manager |
Персональный менеджер | Private Client Specialist (Personal Manager обычно используется в значении «личный помощник звезды шоу-бизнеса») |
Старший менеджер | Senior Manager |
Старший менеджер по продажам | Senior Sales Manager |
Территориальный менеджер | Area Manager |
Топ-менеджер | Executive Officer |
Специалист
Должность | Перевод на английский |
---|---|
Ведущий специалист | Senior Specialist |
Главный специалист | Senior Specialist |
ИТ специалист | IT Specialist |
Специалист отдела | Specialist of Department |
Специалист по документообороту | Document Controller |
Специалист по закупкам | Procurement Expert (или Buyer) |
Специалист по кадрам | HR Specialist |
Специалист по недвижимости | Real Estate Specialist |
Специалист по охране труда | HSE Specialist |
Специалист по персоналу | HR Specialist |
Специалист по продажам | Sales Representative (или Sales Associate) |
Специалист по рекламе | Advertising Specialist |
Старший специалист | Senior Specialist |
Технический специалист | Technical Expert |
Разбор архитектуры VIPER на примере небольшого iOS приложения на Swift 4 / Хабр
«У каждого свой VIPER». Автор неизвестен
В данной статье я хотел бы рассмотреть архитектуру VIPER на небольшом конкретном примере, который в того же время показывал всю мощь этой архитектуры и был написан на последнем
Swift 4. Для тех, кто хочет сразу глянуть код, не читая всю статью, ссылка на реп в самом низу.
Оглавление
Вступление
Про архитектуру
VIPERписали уже достаточно
много, в том числе и на хабре (
1,
2).
Все началось с того, что эппловская
MVCархитектура оказалась не очень удачной, о чем более подробно рассказывается в
этой статье. Если вкратце, то
MVCпревратился в
Massive View Controller, т.е. огромный вьюконтроллер, в котором ему позволялось очень много. В нем было много
UIи бизнес-логики, и, как следствие, такой код почти невозможно было тестировать, отлаживать и поддерживать.
Поэтому разработчикам понадобилась другая архитектура, которая была бы более-менее гибкой, соответствовала SOLID принципам (особенно «Принципу единственной ответственности») и чистой архитектуре (обзор на русском).
Rambler подхватили эту тему и посвятили этому целую конференцию и даже написали книгу. Кстати, если вы не знакомы с VIPER, я бы порекомендовал прочитать именно эту книгу, как знакомство с архитектурой. В ней хорошо описано и разжевано, для чего нужен этот VIPER и как появился. Также в книге рассматриваются проблемы классического VIPER, и что разработчики Rambler в ней немного изменили. К сожалению, книга была написана в 2016 году и примеры в ней на Objective-C, как и их опенсорсный проект, который на момент написания этой статьи не компилировался и вообще показался слишком сложным для первого изучения. Проект увешан многими дополнительными штуками, чрезмерной абстракцией и чересчур большим количеством классов. Что на первый взгляд может показаться слишком сложным и отталкивающим.
Поэтому я написал небольшое приложение «Конвертер валют» на VIPER архитектуре, чтобы показать, что нужно писать в каждом слое и какие правила задаются для каждого слоя. Сразу следует сказать, что я использовал не т.н. классический VIPER, а его немного модифицированную версию, вдохновившись опытом Rambler и по их примеру.
Попрошу сильно не придираться, если стилистически на Swift что-то можно было написать более элегантно. Все же статья про архитектуру, а не про красоту самого Swift. Также я намеренно не стал использовать сторонние библиотеки и зависимости. Весь пример написан, используя только родные для iOS библиотеки.
Глава 0. Схема архитектуры VIPER
Пробежимся бегло по принципам VIPER. Один экран или точнее один вьюконтроллер должен соответствовать одному модулю в VIPER. Если в общем, то VIPER призван разбить многострадающий вьюконтроллер на множество слоев, где каждый будет выполнять свою роль. Схематично связь внутри модуля показана на рисунке снизу.
Вероятно, вы видели другие схемы.
Эту, к примеру:Каждая буква из аббревиатуры VIPER на ней что-то обознает:
View–
Interactor–
Presenter–
Entity–
Router. Но реальность такова, что в модуль входят не только эти компоненты, а Entity вообще в понятие модуля может не входить, т.к. является самодостаточным классом, который может использоваться в любом модуле или сервисе. На сложных экранах модуль можно делить на подмодули, где у каждого будут свои презентеры и интеракаторы.
В отличии от классического VIPER в моем нет Wireframe, потому что он выполнял 2 роли: выполнял сборку модуля и осуществлял переход на другой экран (модуль). На схеме показано, что за сборку модуля будет отвечать Configurator, а за переходы Router. Такую логику я перенял у Rambler, с той лишь разницей, что вместо Configurator у них Assembly. Но суть такая же.
Configurator знает о всех зависимостях внутри модуля. В нем устанавливается, что у ViewController будет Presenter, у Presenter будет Interactor и т.д. Более подробно будет рассматриваться далее в примере.
Также в классическом VIPER отказались от Segue, поэтому вы не сможете использовать сториборды для переходов между экранами. В нашем же случае, как и у Rambler, переходы через Segue работают и являются рекомендуемыми для использования, как того хотела Apple.
Так уж получилось, что на 100% пассивную View из вьюконтроллера сделать не получится. Сама Apple заложила для нее определенную роль со своим циклом жизни и вызываемыми методами (viewDidLoad, viewDidAppear и др.), поэтому мы должны это учитывать и строить свою архитектуру, исходя из этого. Сборка модуля запускается из viewDidLoad, когда вьюконтроллер уже загрузился, а не просто инициализировался. Также это дает нам возможность задавать Initial View Controller из сториборда, а не в AppDelegate, как это сделано в классическом варианте. Это гораздо удобней, потому что нет жесткой привязки к какой-то конкретной точке входа, и ее легко можно поменять.
После сборки модуля дальнейшее поведение модуля довольно классическое. View/ViewController не отвечает за логику нажатий на кнопки, ввода текста или какое-либо другое взаимодействие с UI. Все это сразу передается в Presenter. View может быть как в составе модуля, так и быть общей View, и использоваться в разных модулях.
Presenter решает, куда перенаправить действие – на Router или Interactor. Router будет либо закрывать текущий экран, либо открывать новый. Конкретная реализация перехода осуществляется в нем. Interactor решает, что делать дальше с поступившими событиями и какой сервис вызвать. В нем содержится логика модуля.
Но более важной функцией Presenter является подготовка и передача визуальных данных для View/ViewController, которые будут видны для пользователя. Presenter является сердцем нашего модуля, он знает, какие данные будут отображаться и в каком виде. Даже на разных схемах он всегда посередине. (А Interactor, наверно, мозгами)
Interactor является фасадом для других сервисов. Также Interactor может и сам содержать логику. В MVC его можно сравнить с контроллером, но который ничего не знает о том, как будут отображаться данные.
Сервисом в нашей интерпретации называются различные хелперы и другие классы, которые могут быть доступны из разных модулей и частей приложения (логика авторизации, работа с базой, работа с сервером, шифрование и т.п.). Сервисы могут взаимодействовать друг с другом и с Entity. Entity – это просто пассивные сущности (пользователь, книга, слово). Как и говорили ранее, Entity не является компонентом модуля VIPER. Вообще, изначально архитектура называлась VIP.
Если вы ничего не поняли, не беда. Дальше на примере все станет ясно, это было лишь поверхностное описание.
Глава 1. Пример очень простого модуля
Как ни странно, но рассматривать архитектуру я начну не с первого более сложного экрана, а с экрана
«О приложении», который очень простой. Сам экран имеет пару лейблов, кнопку
«Закрыть»и кнопку со ссылкой на сайт. При нажатии на
«Закрыть»текущий экран закроется и будет показан предыдущий главный экран, а при нажатии на ссылку она откроется в Сафари. Лейблы пассивные и не меняются.
Такие экраны в приложении не показывают всю мощь и необходимость VIPER, ведь можно было все разместить и во ViewController, как могут подумать некоторые. Но идеология чистой архитектуры противоречит этому принципу, поэтому даже самый простой экран и даже самое простое приложение можно и нужно писать на архитектуре VIPER. Вы должны придерживаться правил всегда.
Названия модуля желательно выбирать коротким, потому что внутри модуля для классов к этому названию будут прибавляться дополнительные слова. К примеру, модуль «О приложении» назовем About. Вьюконтроллер будет называться AboutViewController. Остальные классы AboutPresenter, AboutInteractor, AboutConfigurator и т.д.
Если инициализация модуля начинается с вьюконтроллера, то и рассматривать модуль надо начинать с него. Создадим классы AboutViewController и AboutConfigurator. Класс AboutConfigurator должен соответствовать протоколу AboutConfiguratorProtocol и будет иметь лишь один метод:
protocol AboutConfiguratorProtocol: class {
func configure(with viewController: AboutViewController)
}
class AboutConfigurator: AboutConfiguratorProtocol {
func configure(with viewController: AboutViewController) {
}
}
В дальнейшем внутри этого метода я буду конфигурировать модуль.
AboutViewControllerбудет иметь свойство
configurator, который во
viewDidLoadбудет конфигурироваться, и свойство
presenter, который будет соответствовать протоколу
AboutPresenterProtocol.
Важное правило! Все компоненты общаются между собой только через протоколы, а не напрямую! Это необходимо для написания юнит-тестов в дальнейшем и для поддержания кода в чистоте в целом.
AboutPresenterProtocol должен содержать метод configureView(), который будет инициализировать и конфигурировать первоначальные данные для визуальных элементов во вьюконтроллере. На данном этапе AboutViewController будет выглядеть так:
class AboutViewController: UIViewController {
var presenter: AboutPresenterProtocol!
let configurator: AboutConfiguratorProtocol = AboutConfigurator()
override func viewDidLoad() {
super.viewDidLoad()
configurator.configure(with: self)
presenter.configureView()
}
}
Presenter
будет иметь также
routerи методы, которые будут вызываться при нажатии на кнопку
«Закрыть»и кнопку со ссылкой на сайт.
AboutPresenterProtocolбудет выглядеть так:
protocol AboutPresenterProtocol: class {
var router: AboutRouterProtocol! { set get }
func configureView()
func closeButtonClicked()
func urlButtonClicked(with urlString: String?)
}
Модуль этот очень простой, поэтому вся конфигурация вьюконтроллера будет заключаться в том, что подпись к кнопке с
URLбудет устанавливаться из кода, а не из визуального редактора. Для
AboutViewControllerтакой протокол:
protocol AboutViewProtocol: class {
func setUrlButtonTitle(with title: String)
}
Внутри
AboutPresenterреализовываем метод:
func configureView() {
view.setUrlButtonTitle(with: interactor.urlRatesSource)
}
Теперь подошла очередь и интерактора. Логику и хранение/извлечение данных всегда надо переносить туда. В нашем случае интерактор будет иметь свойство, которое будет хранить
URLсайта и метод, который будет открывать этот
URL:
protocol AboutInteractorProtocol: class {
var urlRatesSource: String { get }
func openUrl(with urlString: String)
}
А как же обработка события нажатия на кнопку
«Закрыть», можете подумать вы? Здесь презентер решает, что это событие связано с переходом между экранами, поэтому обработка будет передаваться в роутер. Для этого модуля роутер умеет только закрывать текущий вьюконтроллер.
Его протокол:
protocol AboutRouterProtocol: class {
func closeCurrentViewController()
}
А протокол презентера будет выглядеть так:
protocol AboutPresenterProtocol: class {
var router: AboutRouterProtocol! { set get }
func configureView()
func closeButtonClicked()
func urlButtonClicked(with urlString: String?)
}
Теперь, когда у нас есть все описанные протоколы для компонентов модуля VIPER, перейдем к самой реализации этих методов. Не забудем дописать, что вьюконтроллер соответствует протоколу
AboutViewProtocol. Я не буду описывать, как кнопку со сториборда связать со свойством вьюконтроллера и привязать события нажатия на них, поэтому сразу напишу методы вьюконтроллера:
@IBOutlet weak var urlButton: UIButton!
@IBAction func closeButtonClicked(_ sender: UIBarButtonItem) {
presenter.closeButtonClicked()
}
@IBAction func urlButtonClicked(_ sender: UIButton) {
presenter.urlButtonClicked(with: sender.currentTitle)
}
func setUrlButtonTitle(with title: String) {
urlButton.setTitle(title, for: .normal)
}
Вьюконтроллер понятия не имеет, что делать после нажатия на кнопки, но он точно знает, что делать, когда у него вызвали метод
setUrlButtonTitle(with title: String). Вьюконтроллер только обновляет, передвигает, перекрашивает, скрывает
UI-элементы на основе данных, с которыми презентер вызвал этот метод. В то же время презентер не знает, как именно все эти данные располагаются во
View/ViewController.
Полный класс презентера выглядет так:
class AboutPresenter: AboutPresenterProtocol {
weak var view: AboutViewProtocol!
var interactor: AboutInteractorProtocol!
var router: AboutRouterProtocol!
required init(view: AboutViewProtocol) {
self.view = view
}
// MARK: - AboutPresenterProtocol methods
func configureView() {
view.setUrlButtonTitle(with: interactor.urlRatesSource)
}
func closeButtonClicked() {
router.closeCurrentViewController()
}
func urlButtonClicked(with urlString: String?) {
if let url = urlString {
interactor.openUrl(with: url)
}
}
}
Мы совсем забыли про наш конфигуратор. Ведь без него ничего работать не будет. Его код:
class AboutConfigurator: AboutConfiguratorProtocol {
func configure(with viewController: AboutViewController) {
let presenter = AboutPresenter(view: viewController)
let interactor = AboutInteractor(presenter: presenter)
let router = AboutRouter(viewController: viewController)
viewController.presenter = presenter
presenter.interactor = interactor
presenter.router = router
}
}
Понятное дело, чтобы не получить
Reference cycle, презентер у вьюконтроллера указывается как
strong, а вьюконтроллер у презентера как
weak, интерактор у презентера указывается как
weak, ну и так далее. Во всей этой цепочке самым главным остается
ViewController. Поэтому говорить о пассивном
Viewздесь неуместно. При закрытии
ViewControllerвсе остальные элементы тоже уничтожаются, потому что никто не может иметь
strongссылку на
ViewController. В противном случае мы бы получали утечку памяти (
memory leak).
Класс интерактора выглядет так:
class AboutInteractor: AboutInteractorProtocol {
weak var presenter: AboutPresenterProtocol!
let serverService: ServerServiceProtocol = ServerService()
required init(presenter: AboutPresenterProtocol) {
self.presenter = presenter
}
var urlRatesSource: String {
get {
return serverService.urlRatesSource
}
}
func openUrl(with urlString: String) {
serverService.openUrl(with: urlString)
}
}
Код довольно простой, поэтому комментарии излишни. Стоит обратить внимание на
ServerService. Это сервис, который будет отдавать
URLдля нашей кнопки на вьюконтроллере и открывать ссылку в Сафари (или как-нибудь по другому). Код
ServerServiceи его протокола выглядет так:
protocol ServerServiceProtocol: class {
var urlRatesSource: String { get }
func openUrl(with urlString: String)
}
class ServerService: ServerServiceProtocol {
var urlRatesSource: String {
return "https://free.currencyconverterapi.com"
}
func openUrl(with urlString: String) {
if let url = URL(string: urlString) {
UIApplication.shared.open(url, options: [:])
}
}
}
Здесь тоже все просто. Остался только роутер:
class AboutRouter: AboutRouterProtocol {
weak var viewController: AboutViewController!
init(viewController: AboutViewController) {
self.viewController = viewController
}
func closeCurrentViewController() {
viewController.dismiss(animated: true, completion: nil)
}
}
Еще раз повторю, что весь исходный код есть в репозитории. Ссылка в конце статьи.
Глава 2. Пример более сложного модуля
Настало время рассмотреть архитектуру на более сложном примере и подытожить правила для каждого слоя.
Сториборд со всеми экранами выглядет так. Главный экран позволяет выбирать валюту, из которой конвертируем и в которую конвертируем. Также можно вводить сумму, из которой надо сконвертировать в другую валюту. Под полем ввода отображается сконвертированная в другую валюту сумма. А в самом низу курс конвертации и кнопка перехода на экран «О приложении«.
Данные о всех валютах и их курсе запрашиваются с бесплатного сайта https://free.currencyconverterapi.com. Данные для простоты примера будем хранить в UserDefaults, но запросто можно переделать все лишь один класс, чтобы хранить их в Core Data или любым другим способом.
Теперь, когда мы знаем, как выглядет каркас модуля VIPER, мы запросто сможем то же самое сделать для главного экрана. Справа показаны файлы модуля Main (главного экрана). Небольшим неудобством архитектуры является то, что для каждого модуля нужно создавать много файлов, а вручную на это уходит много времени. Поэтому в Rambler придумали генератор кода Generamba, который выполняет рутинную работу за нас. Если покопаться, то его можно настроить под себя. Либо же можно использовать шаблоны для Xcode, примеров в сети предостаточно. Например, https://github.com/Juanpe/Swift-VIPER-Module или https://github.com/infinum/iOS-VIPER-Xcode-Templates. Более подробно эти темы рассматриваться не будут, т.к. это выходит за рамки статьи.
В глаза бросается то, что для протоколов я создал отдельный в файл в каждом модуле. Если вам не нравится такой подход, то вы можете описывать протоколы прям в файле самих классов. Лично мне удобней, когда все протоколы модуля собраны в одном месте. Дело вкуса.
По традиции также начнем рассматривать модуль с вьюконтроллера. Важным правилом для View/ViewController является то, что в них не передаются Entity напрямую. Для этого должны создаваться дополнительные слои/сервисы.
Метод viewDidLoad будет идентичен реализации из модуля About. Вызовется конфигурирование модуля и будет дана команда интерактору сконфигурировать View (ViewController в нашем случае).
Конфигурирование модуля почти такое же, как в модуле «About». Но на главном экране понадобиться дополнительный View-компонент CurrencyPickerView, он создается как отдельный класс и может быть переиспользован в других местах или даже приложениях. В сториборде на главном экране добавляется обычный UIView и выставляется класс CurrencyPickerView для него.
Весь код CurrencyPickerView рассматриваться не будет. Хотя IBOutlet для него находится во вьюконтроллере, его логика будет обрабатываться в презентере. Поэтому в конфигураторе прописывается ссылка на него. У CurrencyPickerView также есть делегат, и им будет не вьюконтроллер, а презентер. В конфигураторе дописываем следующие вызовы:
class MainConfigurator: MainConfiguratorProtocol {
func configure(with viewController: MainViewController) {
...
presenter.currencyPickerView = viewController.currencyPickerView
viewController.currencyPickerView.delegate = presenter
}
}
На более сложном примере становится ясно, что вьюконтроллер разгружается, а логика переносится от презентера к интерактору и дальше к сервисам. Конфигурирование
Viewв этом модуле более сложное и включает установку сохраненных значений, которые использовались последний раз до закрытия приложения. Код такой:
func configureView() {
view?.setInputValue(with: inputValue)
view?.setOutputValue(with: outputValue)
view?.setInputCurrencyShortName(with: inputCurrencyShortName)
view?.setOutputCurrencyShortName(with: outputCurrencyShortName)
view?.addDoneOnInputCurrencyKeyboard()
updateRateText()
interactor.getAllCurrencies()
}
Помимо установки начальных значений для UI-компонентов, в интерактор посылается запрос о получении списка всех валют. Презентер не знает, откуда будут получены эти данные, но он знает, что они ему нужны. Также значения
inputValue,
outputValue,
inputCurrencyShortNameи
outputCurrencyShortNameзапрашиваются у интерактора, т.к. только он знает, откуда взять эти сохраненные данные:
var inputValue: String? {
set {
if let value = newValue {
interactor.inputValue = Double(value) ?? 0.0
}
}
get {
var input = String(interactor.inputValue)
if input.hasSuffix(".0") {
input.removeLast(2)
}
return input
}
}
var outputValue: String? {
get {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
formatter.maximumFractionDigits = 2
formatter.roundingMode = .down
formatter.usesGroupingSeparator = false
let number = NSNumber(value: interactor.outputValue)
var output = formatter.string(from: number)!
if output.hasSuffix(".00") {
output.removeLast(2)
}
return output
}
}
var inputCurrencyShortName: String {
get {
return interactor.inputCurrencyShortName
}
}
var outputCurrencyShortName: String {
get {
return interactor.outputCurrencyShortName
}
}
В комментариях к VIPER я встречал такое мнение, что презентер особо ничего не делает и просто передает данные от вьюконтроллера к интерактору и обратно. Из кода выше становится ясно, что презентер не просто запрашивает данные у интерактора и отдает «как есть», а также выполняет подготовку и форматирование данных в нужном виде. Запомните, что презентер отвечает за то, какие именно данные и в каком виде будут переданы вьюконтроллеру. Вьюконтроллеру уже не надо заботится об их форматировании, он лишь присвоит их нужным UI-компонентам.
Презентер ничего не знает о UIKit, он не знает об UIButton, UILabel и никаких других визуальных компонентах. Это очень важно. Вся работа с UIKit происходит во вьюконтроллерах и других View-компонентах. Также и при нажатии на кнопку нельзя передавать параметром UIButton, презентер не должен знать об этом. Поэтому нажатия на кнопки и ввод текста в поле ввода обрабатываются во вьюконтроллере таким образом:
@IBAction func inputCurrencyButtonClicked(_ sender: UIButton) {
presenter.inputCurrencyButtonClicked()
}
@IBAction func outputCurrencyButtonClicked(_ sender: UIButton) {
presenter.outputCurrencyButtonClicked()
}
func textFieldDidBeginEditing(_ textField: UITextField) {
presenter.textFieldDidBeginEditing()
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if textField == inputTextField {
if textField.availableAdding(string: string) {
textField.addString(string)
self.presenter.inputValueChanged(to: textField.text ?? "")
}
return false
}
return true
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {
if textField == inputTextField {
textField.clear()
self.presenter.inputValueCleared()
return false
}
return true
}
Допустим, надо написать кастомный UI-элемент или дописать
extensionдля готового. Рассмотрим, например,
UITextFieldиз главного модуля. Компонент может содержать свою внутреннюю логику, касающуюся только его. К примеру, поле ввода суммы валюты может быть дробным, но нельзя ввести 2 нуля подряд в начале
(«00»)или вводить несколько точек
(«0.11.2»), запятая преобразуется в точку, вводить можно только числа, добавляется дополнительная кнопка к клавиатуре и т.д. В таком случае разрешается эту логику выносить в сам элемент. Ведь эта логика не затрагивает логику других компонентов приложения, а относится только к нему самому. Например, вот так:
extension UITextField {
func availableAdding(string: String) -> Bool {
switch string {
case "":
return self.text != ""
case "0"..."9":
return self.text != "0"
case ".", ",":
return self.text!.count > 0 && self.text!.range(of: ".") == nil && self.text!.range(of: ",") == nil
default:
return false
}
}
func addString(_ string: String) {
var newValue: String = self.text ?? ""
var addingString = string
if addingString == "", newValue.count > 0 {
newValue.removeLast()
} else if addingString != "" {
if addingString == "," {
addingString = "."
}
newValue.append(addingString)
}
self.text = newValue
}
func clear() {
self.text = ""
}
func addDoneOnKeyboard() {
let keyboardToolbar = UIToolbar()
keyboardToolbar.sizeToFit()
let flexBarButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
let doneBarButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(dismissKeyboard))
keyboardToolbar.items = [flexBarButton, doneBarButton]
self.inputAccessoryView = keyboardToolbar
}
@objc func dismissKeyboard() {
self.resignFirstResponder()
}
}
Другое дело, когда такая логика может затрагивать внешние данные, например, доступность логина для юзера при регистрации, т.к. будет запрос к серверу или базе данных. Или повтор пароля, ведь это уже затронет другой компонент. В общем, в UI-компонент можно вносить логику, которая относится только к нему самому. Хотя для кого-то это может показаться спорным моментом.
Рассмотрим, как происходит получение данных о валютах с сервера. В презентере произошел вызов метода getAllCurrencies() и все. Что должно происходить дальше, презентер не знает. Дальнейшая логика пишется в интеракторе и там, по необходимости, посылаются команды презентеру, что нужно делать. Реализация такая:
func getAllCurrencies() {
presenter.showHUD()
serverService.getAllCurrencies { (dict, error) in
if let error = error {
self.presenter.hideHUD()
self.presenter.showLoadCurrenciesButton()
self.presenter.showAlertView(with: error.localizedDescription)
return
}
if let dictResponse = dict {
self.currencyService.saveAllCurrencies(with: dictResponse, completion: { (error) in
if let error = error {
self.presenter.hideHUD()
self.presenter.showAlertView(with: error.localizedDesc)
return
}
self.currencyService.sortAndUpdateCurrentCurrencies()
self.getOutputCurrencyRatio(newCurrency: nil)
})
}
}
}
В этом интеракторе задействованы уже 2 сервиса:
CurrencyService, который отвечает за работу с валютами, и ранее известный
ServerService, который отвечает за работу с сервером. Конечно,
ServerServiceбыло бы правильней разбить на несколько классов-сервисов, чтобы переиспользовать методы работы не с конкретным сервером, а с любым. Но я ограничился здесь одним классом, чтобы упростить и не создавать по миллион классов на все, ведь для архитектуры модулей VIPER это не повредит.
Для сервисов тоже очень желательно создавать протоколы, чтобы работать через них и не привязываться к конкретным классам, согласно одному из принципов SOLID принципу инверсии зависимостей.
Сервис CurrencyService будет помогать работать с такой структурой данных, как Currency (валюта). Он будет отдавать все доступные валюты, текущее введенное значение для валюты, типы валют, а также уметь сохранять, сортировать и получать курс относительно двух валют. Его протокол выглядет так:
protocol CurrencyServiceProtocol: class {
var currencies: [Currency] { set get }
var currencyNames: [String] { set get }
var inputValue: Double { set get }
var outputValue: Double { get }
var inputCurrency: Currency { set get }
var outputCurrency: Currency { set get }
func saveAllCurrencies(with dict: [String: Any], completion: @escaping (CurrencyError?) -> Swift.Void)
func sortAndUpdateCurrentCurrencies()
func saveOutputCurrencyRatio(with dict: [String: Any], completion: @escaping (CurrencyError?) -> Swift.Void)
}
Сервис
CurrencyServiceзапрашивает данные у другого сервиса
StorageService, который сохраняет данные в
UserDefaults, а интерактор даже и не подозревает, что данные вообще сохраняются, не говоря о том, как они сохраняются. Интерактор даже не знает, что существует сервис
StorageService, потому что сервис-хелпер
CurrencyServiceвыполняет всю работу сам и только отдает данные интерактору.
Интерактор главного модуля в основном состоит из абстракций и вызовов к методам протоколов сервисов, поэтому для таких слоев очень легко писать юнит-тесты, т.к. создать моки и стабы для них не составит большого труда. Нет привязки к конкретным классам.
Я не буду дальше подробно рассматривать каждый метод и каждую строчку оставшихся классов. Общая суть архитектуры и роль каждого слоя уже должна быть ясна. Последнее, о чем хотел бы сказать, это переход на другой экран через Segue.
Apple заложила этот функционал для вьюконтроллера, поэтому и нам надо исходить из такого подхода, а не переходить через navigationController?.pushViewController(vc, animated: true). После нажатия на кнопку «Инфо» должен открыться экран «О приложении». Поэтому событие нажатия кнопки презентер передает роутеру, а он вызывает следующий метод:
func showAboutScene() {
viewController.performSegue(withIdentifier: viewController.selfToAboutSegueName, sender: nil)
}
Вьюконтроллер вызывает системный
prepare(for segue…), а он уже напрямую передает это событие в роутер:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
presenter.router.prepare(for: segue, sender: sender)
}
Получилось, что презентер минуется в этом случае. Если кому-то не нравится такое нарушение, то надо либо пропускать метод через презентер, передавая как параметр UI-элемент, что будет тоже нарушением. Либо придумать что-нибудь еще. Лучшего варианта я сам пока не нашел. Если бы можно устанавливать делегат для
prepare(for: segue, sender: sender), то, конечно, им был бы роутер.
Заключение
Указанный вариант архитектуры не является идеальным. Недаром в начале статьи я привел изречение, что у каждого свой VIPER. Сколько людей, столько и мнений. Я встречал варианты, когда несколько модулей группировали в рамках одного юзер-стори и писали один роутер для нескольких модулей. Или в другом варианте один интерактор на несколько модулей. Многие используют классический вариант с
Wireframe, другие придумывают что-то еще. Кто-то передает во вьюконтроллер
Entity. Последнее, конечно, неправильно.
Даже если у вас есть написанное как попало приложение, VIPER позволяет переписывать все постепенно. Вьюконтроллер за вьюконтроллером. Это же презентационный слой и каждый модуль не зависит от архитектуры и реализации другого. Начните переносить логику в сервисы постепенно. Разгружайте вьюконтроллер. И в дальнейшей поддержке кода такое разделение по слоям вам многократно окупится.
В статье я не затронул Dependency Injection в модулях для iOS, например, Typhoon. И еще много других свистоперделок дополнительных и полезных вещей, облегчающих разработку. Общее поведение для модулей можно было вынести в абстрактные классы и протоколы, а потом наследоваться от них. В общем, любой проект и код можно улучшать до бесконечности и он все-равно не будет идеальным.
Каким бы ни был ваш VIPER, важно следовать четкому разделению ответственности между слоями и работать с абстракциями (протоколами). Написание тестов для VIPER-модулей рассмотреть уже не получится, но для такого кода их писать будет намного легче.
Вероятно, статья получилась немного сумбурной и объемной, но для того я и предоставил весь исходный код, чтобы вы сами во всем разобрались. Конструктивная критика и обсуждение приветствуется. Возможно, я что-то неправильно написал. Пишите в комментариях.
Ссылка на репозиторий.
АВТОБАЙ|Удаление вмятин без покраски в Ижевске
Виктор Ч.
Mazda CX-5.Предварительно оценили работу по удалению вмятин на капоте по фото. По прибытию был произведен осмотр и согласование по объему и цене. Цена осталась та же, что и была указана предварительно. Работа была выполнена очень качественно мастером Павлом и быстрее, чем предполагалось. Наблюдал работу, видно что МАСТЕР, знает и качественно исполняет свое дело. Большое спасибо. РЕКОМЕНДУЮ!!!
Алексей
То, что вы делаете с автомобилями нельзя назвать работой или даже искусством…
ЭТО ВОЛШЕБСТВО!!! Мне еще не приходилось видеть восстановления элемента без покраски, который малярами был приговорен к замене. Вы ЛУЧШИЕ!!!!
Все отзывы можно посмотреть здесь.
Вам нужно недорого и качественно удалить вмятины на вашем авто? Вы открыли нужный сайт – сайт Автобай. Мы занимаемся выправлением вмятин без покраски в Ижевске. Большой опыт работы наших мастеров, ответственный подход к выполнению своей работы, профессиональное оборудование и качественные расходные материалы сделали наш автосервис Автобай популярным среди автолюбителей города. Чтобы убедиться в этом, достаточно взглянуть на статистику поисковых запросов в Ижевске.
Все чаще, при поиске в яндекс и гугл встречаются запросы: сайт автобай, автобай, авто бай, автобай ру. Это говорит о том, что автовладельцы рассказывают друг другу о нашем автосервисе. А лучшая рекомендация – рекомендация друга т.к. он может показать результаты работы и всегда скажет правду.
К сожалению, не все автовладельцы, которые хотят исправить вмятины на своем автомобиле в нашем автосервисе, находят нас в сети интернет. Название нашего автосервиса – Автобай. Название пишется слитно Автобай, а не раздельно, например, как Авто бай. Наши клиенты иногда сетуют на то, что если набрать название раздельно, то поисковики выводят все что угодно, но только не наш сайт Автобай. Мы знаем об этой проблеме и активно работаем над тем, чтобы быть ближе к вам в сети интернет.
Так же возникают затруднения у тех автовладельцев, кто, полагая, что адрес нашего сайта созвучен с названием, ищут нас по запросу автобай ру. К сожалению, на момент регистрации домена, домен автобай ру уже был занят компанией в другом регионе. Поэтому, еще раз акцентируем ваше внимание на том, что адрес нашего официального сайта Автобай – 18servis.ru. Только по этому адресу вы сможете найти нас.
Таким образом, если вы хотите найти официальный сайт автосервиса Автобай, пожалуйста, набирайте в поисковике автосервис Автобай или 18servis.ru
Автобай – это мы.
Возвращаясь к вопросу качества, еще одним подтверждением качества наших работ служат отзывы автовладельцев, оставляемые о нашей работе на различных специализированных сервисах, таких как яндекс-карты. Мы благодарны всем тем автовладельцам, кто воспользовался нашими услугами и оставил отзыв. Нам действительно важно мнение наших клиентов.
Благодаря отзывам, с уверенностью можно сказать, что сегодня Автобай – это знак качества. Мы гордимся этим и делаем все возможное для того чтобы оправдать доверие наших клиентов и сделать уровень качества своих работ еще выше.
Приезжайте и убедитесь в этом сами.
Не работает Google Play Market сегодня Октябрь 2021 — белый экран при загрузке (не запускается)
В этой статье давайте разберемся почему сегодня не работает Play Market Google и что делать. Будем по порядку выполнять действия с телефоном до полного решения возникшей проблемы доступа. Читайте до конца.
Данная статья подходит для всех брендов, выпускающих телефоны на Android 10/9/8/7: Samsung, HTC, Lenovo, LG, Sony, ZTE, Huawei, Meizu, Fly, Alcatel, Xiaomi, Nokia и прочие. Мы не несем ответственности за ваши действия.
Внимание! Вы можете задать свой вопрос специалисту в конце статьи.
Что с Play Market и серверами Google
Прежде чем начинать диагностику Андроид, убедитесь, что Плей Маркет работает на других устройствах. Попробуйте зайти в Google Play через браузер на компьютере. Если везде будет ошибка — например, устройство пишет «Время ожидания истекло» — то проблема явно на стороне Google. Подождите немного и затем попробуйте снова.
Сброс настроек и удаление обновлений
Если Play Market не запускается, сбросьте его настройки у себя в телефоне или планшете:
- Откройте настройки Android.
- Перейдите в раздел «Приложения» или «Диспетчер приложений».
- Найдите Play Market.
- Нажмите «Память» -> «Очистить кэш» и «Стереть данные».
- Перезагрузите устройство.
Если проблема возникла после обновления Play Market, например, загорается экран и тухнет, то откатитесь к предыдущей версии. Так же зайдите в параметры приложения и выберите «Удалить обновления».
УвеличитьОчистку кэша и удаление данных иногда приходится выполнять для Сервисов Google Play и Google Services Framework, которые тоже связаны с работой магазина приложений.
Нужна помощь?Не знаешь как решить проблему в работе своего гаджета и нужен совет специалиста? На вопросы отвечает Алексей, мастер по ремонту смартфонов и планшетов в сервисном центре.Напиши мне »
Перезагрузка и проверка интернета
Если ошибка появилась первый раз, перезагрузите устройство. Возможно, Play Market не запускается из-за небольшого системного сбоя, для устранения которого вполне хватит перезапуска Android. Чтобы перезагрузить телефон:
- Зажмите клавишу питания.
- Держите, пока не появится окно выключения.
- Выберите пункт «Перезагрузка».
Если при запуске Play Market вы видите белый экран, проверьте работу интернет-соединения. Возможно, подключение отсутствует, поэтому вы не можете зайти в магазин приложений. Запустите браузер и зайдите на любой сайт, чтобы убедиться в том, что интернет работает.
В апреле 2018 года Роскомнадзор начал банить Телеграм и под «раздачу» попали IP компании Google. В результате для части жителей Российской Федерации стали не доступны некоторые сервисы, в том числе Play Market. Убедитесь, что это не ваш случай, не смотря на дату, т.к. аналогичная ситуация может повториться в любое другое время.
Кроме того, убедитесь в правильности установленной даты и времени. Включите автоопредение по данным сети или настройке правильную дату вручную.
Play Market — основной источник приложений для Android. Если он не работает, например, пишет «Ошибка RH-01» или «Вход не выполнен», то пользователь лишается возможности быстро устанавливать новые программы. Причины сбоя могут быть разными, но чаще всего их можно выявить и устранить самостоятельно.
Включение Аккаунтов Google и Диспетчера загрузки
Чтобы Play Market работал, в списке запущенных приложений должны быть Аккаунты Google и Диспетчер загрузки. Чтобы найти их, в разделе «Приложения» перейдите на вкладку «Все» или «Показать системные приложения».
УвеличитьЕсли программа не работает, нажмите кнопку «Включить». Заодно почистите кэш и данные, если они есть.
Проблемы с аккаунтом
Если вы не авторизованы, то для работы в Play Market необходимо войти в аккаунт Google. Иногда в работе учетной записи возникают проблемы, поэтому приходится ее удалять и добавлять заново. Для этого:
- Откройте настройки, найдите раздел «Аккаунты».
- Выберите действующую учетную запись Google.
- Синхронизируйте вручную все данные, чтобы они сохранились на серверах Google.
- Вернитесь в предыдущее меню и выберите «Удалить».
Читайте статью На Android не включается синхронизация аккаунта Google
После удаления добавьте аккаунт заново, введя логин и пароль. Синхронизированные данные вернутся в телефон автоматически.
Конфликт приложений
Если проблема возникла после установки Freedom, приложения для обхода проверки лицензии и совершения бесплатных покупок, то его необходимо удалить.
- Откройте список приложения в настройках, перейдите на вкладку «Установленные».
- Найдите Freedom и нажмите Stop.
- После остановки удалите Freedom
- Перезагрузите устройство.
Вместо Freedom причиной неполадки может быть другое приложение. Если ошибка возникла после установки какой-то программы, отключите ее и удалите.
Очистка файла hosts
Работа Freedom и других приложений может принести еще одну проблему — добавление в файл hosts записей, которые блокируют подключение к серверам Google. Чтобы убрать ограничение, понадобятся root-права.
- Запустите приложение Root Explorer
- Найдите папку system.
- Зайдите в каталог etc и установите права R/W.
- Выберите файл hosts.
- Предоставьте права суперпользователя приложению.
- Удалите все лишние строки, оставив только 127.0.0.1 localhost.
Все остальные строки — это изменения, внесенные приложениями и сайтами. Из-за них Play Market может оказываться недоступным для подключения.
Как создать аккаунт в Google на Android с телефона
Сброс настроек и перепрошивка
Если ничего не помогает, сбросьте настройки Android. Это приведет к удалению данных, которые хранились на внутреннем накопителе, поэтому предварительно сделайте их резервную копию.
Названия пунктов могут незначительно отличаться в зависимости от производителя телефона/планшета.
- Откройте раздел «Архивация и сброс» в настройках.
- Выберите «Сброс данных».
- Подтверждаем.
В крайнем случае придется перепрошивать устройство. Устанавливайте только официальные или проверенные кастомные прошивки, чтобы избежать появления новых проблем.
АвторМастер Николай
Инженер по ремонту мобильной и компьютерной техники в специализированном сервисном центре, г. Москва. Непрерывный опыт работы с 2010 года.
Есть вопросы? Задавайте в комментариях к статье. Отвечать стараюсь максимально быстро вам на указанную почту. Каждый случай индивидуален и поэтому очень важно, чтобы вы максимально расписали свою проблему и какая у вас модель устройства.
【решено】 Как писать маленькое — How.co
Как написать меньше?
Что такое маленький?
(запись 1 из 2) 1 устарело: поминутно, скудно. 2 устаревшие: в небольшом количестве, степени или также в виде: немного или в значительной степени. 3: в мелком масштабе: тонко, изящно, стройно смаленько построено.
В чем разница между маленьким и маленьким?
‘ Small ‘ используется с существительными: Например: У меня есть small вина.« Little » используется только с «бесчисленными существительными», когда вы хотите сказать «недостаточно». « Little » используется для обозначения степени прилагательного: не существует «сравнительных» и «превосходных» форм « little ». Например: она маленькая, толстая.
Что означает «маленький»?
Некоторые общие синонимы small — уменьшительное, little , miniature, minute и tiny .
Что означает слово из семи букв?
Все ответы на кроссворды для: Small
Подсказка | Ответ | Письма |
---|---|---|
Малый | TITULAR | 7 |
Малый | БОЛЬШОЙ | 7 |
Малый | DWARFED | 7 |
Малый | СТАНТИНГ | 7 |
Какое еще слово обозначает небольшую сумму?
Как еще можно обозначить небольшую сумму?
пригоршня | несколько |
---|---|
хоть | сенсорный |
tad | smidgen |
тире | smidge |
маленькая | йота |
Что такое синоним добра?
прил.приятно, хорошо. прил. моральный, добродетельный. adj. компетентный, опытный. прил. полезный, адекватный. прил. надежный; незапятнанный.
Как называются малые короны?
подробнее. типы: венчик. корона малая ; обычно указывает на высокий ранг, но ниже суверенного.
Как называется женская корона?
Тиара (от латинского: tiara , от древнегреческого: τιάρα) — это украшенная драгоценными камнями декоративная корона , которую традиционно носят женщины. Его надевают во время официальных мероприятий, особенно если дресс-код — белый галстук.
Что означает Crown?
КОРОНА
Сокращение | Определение |
---|---|
КОРОНА | Постоянный победитель в области питания в регионе (награда) |
КОРОНА | Консолидированные почечные операции в сети с поддержкой Интернета (Центр услуг Medicare и Medicade) |
КОРОНА | Общественные исследования для сети здоровья полости рта (Университет Кейп-Вестерн-Резерв; Кливленд, Огайо) |
Что означает «Корона» на сленге?
, чтобы ударить кого-нибудь, особенно.на голове.
Что значит 👑 для девочки?
👸 Значение — Princess Emoji👸 Изображение лица женщины с короной на голове — это смайлик , который относится к кому-то, кого ценят и особенного. Этот смайлик — это , используемый как с положительным, так и с отрицательным подтекстом.
Что означает этот смайлик 👑?
👑 Значение — Корона EmojiЭтот смайлик отображается как золотая корона с драгоценностями по бокам, символ Короля.В основном это означает что-либо, связанное с королевской властью и высшим или лучшим. Модель Crown Emoji появилась в 2010 году и также известна как King Emoji . Иногда упоминается как Queen Emoji .
Что вы уронили означает?
Краткое описание: В комментарии « Вы сбросили этот номер » в социальных сетях предполагаемый получатель называется королем или королевой после того, как они сделали что-то милое, героическое, легендарное или культовое в Интернете.
Какое время выпало?
Капля прошедшего идеального времени
Единственное число | Множественное число |
---|---|
Я упал | Мы сбросили |
Вы упали | Вы, , выпали |
Он / Она / Оно уронил | Они упали |
29 марта 2021 г.
Сбросил смысл?
Из словаря Longman современного английского пенни ( имеет ) отброшено Неофициальный британский английский раньше говорил, что кто-то уже понял что-то , наконец, что-то, что они не понимали раньше → пенниПримеры из Корпуса пенни ( имеет ) упал • В этот момент пенни упал .
Могу ли я получить значение дропа?
Фильтры. Получить drop on определяется как сленговое выражение для получения преимущества над кем-то или чем-то. Например, получает , а сбрасывает : дает преимущество в тридцать секунд в гонке. глагол. 1.
Что значит уронить мыло?
Если заключенный « роняет мыло », они должны вернуться в начало игры.
Как можно кого-то обидеть?
- (переходный, неформальный) Направлять огнестрельное оружие на другого человека, тем самым завоевывая господство в ситуации. Он надел на них drop и вырубил троих прежде, чем они успели выстрелить.
- (переходный, неформальный, расширенный) На получить преимущество перед другим лицом, действуя перед этим человеком.
Как пишется МАЛЕНЬКИЙ
В настоящее время проверка орфографии является важной частью нашего письма.How-do-you-spell.net — это место, где вы можете найти правильное написание строчного и выясните общие орфографические ошибки с процентным рейтингом. Здесь вы даже можете получить список синонимов для малого. Проверка антонимы к маленькому также могут быть вам очень полезны.
Правильное написание: маленькое
Синонимы:
карликовый, экономный, гладкий, сдержанный, прозрачный, изящный, неполноценный, карликовый, молодой, во рту, скудный, плохой, элегантный, превосходный, атомоподобный, подавленный, скромный, скромный, скупой, доступный, игрушечный, низкий, деликатный, запасной, миниатюрный, краткий, расточительный, ограниченный, скупой, тонкий, жалкий, строчный, избыточный, депрессивный ed, выкл., бесконечно малая, пунктирная линия, широкая, низшая лига, тонкая, щуплая, битти, снаружи, игрушка, уменьшенная, тонкая, приземистая, сломанная, уменьшенная, минимальная, атомарная, подчиненная, тонкая, аденоидная, полированная, измельченная, низкая -звучный, игривый, маленький, атрофированный, карманный, острый, поверхностный, крошечный, пустячный, тонкий, тонкий, краткий, великолепный, карлик, незначительный, красивый, коренастый, хрупкий, экономичный, чистый, младенец, не пожилой, ступня, формат, ничтожный, микроскопический, минутный, неполноценный, подлый, средний, слабый, мелкий, благоприятный, дешевый, нищий, чувствительный, незначительный, случайный, заглавная буква, крошечный, крохотный, крошечный, неполный, незначительный, незрелый, мелкий, бессмысленный, крохотный, скромный, хриплый, ограничительный, бантам, важный, тихий, истощенный, крохотный, мелкий, Микки Маус, ничтожный, недорогой, ограниченный, микроскопический, испорченный, несущественный, малолетний, невнимательный, микро, шрифт, компактный , нелицеприятный, сектантский, изысканный, невысокий, размером с пинту, хилый, замкнутый, коротышка, красивый, униженный, пустяк, самый маленький, низкорослый, подчиненный, скромный, низкий, мертвый, глупый, мягкий, ясный, хриплый, юный, ограничивающий, обрезанный, крохотный, острый, кроткий, лилипутский, крошечный, меньший, большой, сокращенный, наименьший, младший, хрупкий, специфический, испорченный, умеренный, уплотненный, приглушенный, изящный, низкий, тощий, пухлый, непослушный, щадящий, жалкий, исключительный, карликовый, самый маленький, заглавные буквы, половинный, краткий, узкий, эльфийский, запретительный, резкий, креветочный, ослабленный, неуместный, субнормальный, унизительный, несовершеннолетний, конкурентоспособный, мягкий, младший, гномский, фруктовый, нижний, меньший, миниатюрный, бедный, слабый, незначительный, цинга, тонкий, простодушный, пустяковый, мрачный, крохотный, скудный, приниженный, красивый, бестелесный, мелкий, лаконичный, эльфийский, молодой, плоский, раздавленный, провинциальный, битти, ограниченный, смелый, незначительный, унылый, галерный, урезанный, черный, низкопробный, базовый, нелиберальный, шепчущий, низкорослый, медный, низкоуровневый, низкий, тривиальный, крохотный, узкий, субатомный, см приятный, подавленный, на всю страницу, возня, второстепенный, ничтожный, мрачный, под контролем, скупой, маленький, привлекательный, мелкий, урезанный, испорченный, легкомысленный, жалкий, простой, ограниченный, карманный, удрученный, синий, маленький низменный, низкорослый, мускулистый, опушенный, невысокий, мелкий, ясный, немногочисленный, миниатюрный, карманный, неадекватный, экономичный, тихий ред, сдержанный, крохотный, карманный, до полового созревания, скудный, хрупкий, полпинты, изысканный.
Антонимы:
эпический, решительный, неизмеримый, выдающийся, просторный, неограниченный, в натуральную величину, властный, астрономический, потрясающий, беспристрастный, королевский размер, существенный, последовательный, безграничный, пухлый, гималайский, гигантский, товарный вагон, отчетливый, ключевой , грубый, неуклюжий, католический, обширный, превосходный, массивный, монументальный, фундаментальный, тяжелый, сверхнормативный, полноразмерный, грохочущий, кавернозный, выдающийся, толстый, свободомыслящий, большой, великий, обильный, большой, толстый, галактический, щедрый, важный, обширный, богатый событиями, большой, громадный, ошеломляющий, неповоротливый, адекватный, гигантский, стройный, достаточный, доминирующий, замечательный, громкий, пухлый, негабаритный, хороший, необъятный, героический, левиафан, слоновий, крупный, увеличенный, геркулесовский, весомый, объемный, колоссальный, превосходящий, печально известный, неповоротливый, первостепенный, объемный, главный, главный, исключительный, обильный, грандиозный, огромный, больший, королевского размера, здоровый, престижный, выдающийся, человеческого роста, пышный, фараонский, беспристрастный, либеральный, объективный, огромный, двойной, чрезмерно большой, астрономический, здоровенный, огромный, прописные, беспристрастный, широкий кругозор, огромный, тупой, Brobdingnagian, титанический, значимый, значительный, большой, красивый, респектабельный, изумительный, обширный, аккуратный, существенный, чудовищный, потрясающий, безграничный, хриплый, открытый, выдающийся, неумеренный, больший, смертельный, негабаритный, расширенный, впечатляющий, циклопический, в натуральную величину, глубокий, восприимчивый, важный, макроскопический, гигантский, широкий, бесконечный, большой, изобильный, неисчислимый, в натуральную величину, отличительный, превосходящий, раздутый, негабаритный, громоздкий, достойный, обширный, горный, гигантский, гигантский, супер, колоссальный, достаточно, ценный, старый, известный, стоящий, значительный, грубый, буньяновский, космополитичный, негабаритный, гигантский, макроскопический, роковой, величавый, грубый, непредубежденный, крупный, простой, вместительный, красивый, знаменитый, прославленный, широкий, суровый, обильный, заметный, значительный, макро, крупномасштабный, обильный, непредвзятый, монолитный, выдающийся, материальный, космический, терпимый, увеличенный, толстый, слишком большой.
Примеры использования:
1) «То есть маленькая беда», — ответил Стас. — «В пустыне и глуши», Генрик Сенкевич.
2) Я буду в маленькой гостиной .- «Мартины Кро Мартина, Том II (из II)», Чарльз Джеймс Левер.
3) Это дает вам малых кредитов . — «Годы саранчи», Мэри Хелен Фи.
Что означает менуэт против минуты? Определение и примеры — Грамматика
Менуэт — это бальный танец с короткими изящными шагами.Менуэт — достойный танец для группы пар, впервые популярный во Франции семнадцатого века. Музыка для этого танца также называется менуэтом , часто является частью сонаты, симфонии или сюиты. Удар в 3/4 раза. Менуэт происходит от французского слова menuet , что означает тонкий, тонкий, маленький, узкий.
Минуты имеют два значения. 1.) Когда ударение стоит на втором слоге, minUTE , оно действует как прилагательное, означающее маленький, крошечный, незначительный.Форма существительного — минут. Минут происходит от латинского minutus , что означает маленький, маленький. 2.) Когда ударение стоит на первом слоге, МИНУТА , оно действует как существительное, означающее одну шестидесятую часть часа, шестьдесят секунд. Минуты также могут быть шестидесятой градуса угловой меры. Использование минут для обозначения шестидесяти секунд появилось в конце четырнадцатого века, как производное от старофранцузского слова минута , означающего короткую ноту.
Примеры
И как раз тогда, когда их распорядок казался далеким от мира Глюка, танцоры делали что-то, напоминающее менуэт или другой старинный танец. (Reuters)
Только что вышла экранизация фильма Скотта Купера, также называемая «Черная месса»; в нем драматизируется история как смертельный менуэт между коварным преступником Балджером (которого играет Джонни Депп) и ярким шутливым ФБР. агент по имени Джон Коннолли (Джоэл Эдгертон), который занимается им.(The New Yorker)
Удивительные истории и идеи могут быть записаны в мельчайших сдвигах этих изотопов. (Ars Technica)
Важна каждая минута. (Ярмарка тщеславия)Ночь, в которой правила воздушной игры, несколько голевых стрелков, и всего лишь один-единственный удачный перерыв в предсмертной минуте украл бы Зубров игру. (The Winnipeg Free Press)
Нью-йоркская минута, по определению Джонни Карсона, — это интервал между светофором на Манхэттене, загорающимся на зеленый, и парнем позади вас, сигнализирующим гудком.(Forbes)
Как научить ребенка писать слова — чтение яиц
Вернуться к статьямЕсли вы хотите научить своего ребенка правописанию слов и улучшить его общие навыки и уверенность в себе, важно помнить, что процесс обучения должен быть интересным, мотивирующим и увлекательным.
Это особенно важно для детей, которые уже испытывают некоторые трудности с написанием слов. Детям, которые с трудом произносят слова и путают буквы, требуется внимательное и любящее внимание, чтобы помочь им преодолеть эти проблемы и избежать разочарований, поражений и нежелания совершенствоваться.
Вот несколько забавных и простых игр и заданий по правописанию, которые помогут вам научить вашего ребенка правописанию слов и повысить его уверенность в себе:
1. Обучайте ребенка правописанию слов с помощью «Lily Pad Letters»
Возьмите большой лист цветной бумаги и напишите каждую букву алфавита. Вырежьте область вокруг каждой буквы в форме кувшинок и разложите их на полу. Вы даже можете попросить ребенка помочь вам украсить кувшинки и раскрасить их в зеленый цвет.
Попросите двоих ваших детей сыграть в эту игру в пары или объединитесь вместе со своим ребенком сами. Чтобы играть, первый человек должен придумать слово и прочитать его вслух. Затем второй должен наступить на буквы, чтобы записать слово.
2. Используйте «Лестничные ступеньки», чтобы запоминать определенные слова
Это простая игра, которая поможет вашему ребенку запомнить написание определенных слов. Попросите ребенка написать каждое слово, как если бы оно было лестницей, добавляя по одной букве за раз. Например:
S
Sp
Spe
Заклинание
Заклинание
3.Подбрасывать «Орфографический мяч»
Это веселая игра, которая понравится всей семье. Встаньте вместе в круг с мячом. Произнесите слово, подбросьте мяч другому человеку и попросите этого человека произнести слово по буквам и так далее. Если слово написано неправильно, то тот, у кого есть мяч, подбрасывает его другому человеку, который попытается произнести его по буквам.
4. Используйте вырезки из журналов, чтобы ознакомиться с буквами
Попросите ребенка вырезать буквы из газеты или журнала, чтобы составить слова.Это побудит их внимательно и индивидуально рассматривать каждую букву, создавая визуальные представления слов в качестве полезного средства для запоминания.
5. Включите «Закодированное правописание», используя блоки алфавита или магниты на холодильник.
Дайте вашему ребенку несколько зашифрованных слов. Вы можете использовать блоки с алфавитом, магниты на холодильник или даже сделайте свой собственный, написав буквы на листах бумаги. Затем им нужно расшифровать слова в срок. Эта игра составляет отличное соревнование для нескольких детей.
6. Создайте «Орфографический поезд», чтобы получать удовольствие от написания слов
Прочтите слово вслух и попросите ребенка записать его. Используя последнюю букву в этом слове, попросите их написать еще одно слово, начинающееся с этой последней буквы. Они могут продолжить «тренировку правописания», используя последнюю букву слова. Например:
палец
съесть
Чай
Муравей
Олово
7. Играйте в детские онлайн-игры для проверки правописания
Орфографические онлайн-игры, разработанные для детей, — отличный способ научить вашего ребенка правописанию слов и навыков в увлекательной, легкой и очень эффективной форме.Почему бы не посетить область правописания в Reading Eggs прямо сейчас? Ваш ребенок может сыграть более 96 уровневых уроков орфографии , которые являются красочными, интерактивными и увлекательными для маленьких учеников.
Новичок в чтении яиц? Потратьте несколько минут, чтобы зарегистрировать онлайн и получить бесплатную учетную запись — это быстро, просто и на 100% без каких-либо обязательств.
ТвитнутьMinuscule или Miniscule? | Грамматически
- Минускул означает очень маленький.
- Miniscule — это новое написание, вероятно, производное от префикса mini-.
- Многие считают, что miniscule — это орфографические ошибки, но это происходит так часто, что в некоторых словарях встречается как вариант написания.
Говоря о маленьких вещах, люди используют слово мини. Например, маленькая короткая юбка — это мини-юбка. Мини-рецессия — это рецессия с меньшими последствиями, чем полная рецессия. Но минус тоже значит меньше. Как сбивает с толку! Что правильно — крохотное или крохотное?
Сначала поищем определение.Один словарь определяет минускул как очень маленький. Таким образом, вы можете быть уверены, что minuscule — правильное написание. Вот несколько напечатанных примеров:
Все мы мало лжем о себе, своем прошлом и настоящем. Мы думаем, что некоторые из них незначительны и не важны, а другие — большими и компрометирующими. ━Сара Маккой, Дочь пекаря
Эти уровни, однако, ничтожны по сравнению с концентрациями урана, обнаруженными в урановой руде, по словам ученых из U.С. Геологическая служба. ━Аризона Daily Sun
А как насчет миниатюрных ? Если вы выполните поиск miniscule на Dictionary.com, вы найдете его как minuscule . Согласно этому источнику, это альтернативное написание. Однако в примечании к использованию содержится предупреждение: «Хотя это новое написание критикуется многими, оно встречается с такой частотой в отредактированном тексте, что некоторые считают его вариантом написания, а не орфографической ошибкой». Согласно словарю английского языка Merriam-Webster, первый экземпляр miniscule появился в конце девятнадцатого века.Однако «в редактированной прозе» он не стал популярным до 1940-х годов. Давайте посмотрим, как писатели используют miniscule :
Факты показывают, что в масле были обнаружены крошечные фрагменты насекомых. . . ━Нил Д. Фортин, Регулирование пищевых продуктов: закон, наука, политика и практика
«Мадонна — одна из немногих супер-артистов, чье влияние и карьера выходят за рамки музыки», — сказала Дженис Мин, президент и главный креативный директор The Hollywood Reporter-Billboard Media Group.━NewsTalk.com
Первичный английский: расширение знаний на практике сообщает, что словари начали принимать miniscule в последние годы двадцатого века. Он не так популярен, как крохотный , и некоторым он просто не нравится. А ты? Вы будете использовать крохотный или крохотный ?
«маленьких» купюр означают большие победы
Это такие люди, как Джо Монмини из Плимута, у которого в 2017 году в возрасте 53 лет диагностировали болезнь Альцгеймера с ранним началом.
«Эта болезнь крадет вашу личность, крадет ваш опыт. Я просто не хочу, чтобы это уводило меня из моего сообщества », — сказала Монмини Объединенному комитету по делам пожилых людей в понедельник.
Монмини хочет оставаться в своем доме, а не в доме престарелых, даже если его болезнь прогрессирует. Но программа MassHealth, которая обеспечивает уход на уровне домов престарелых в рамках так называемого отказа от прав для слабых пожилых людей, не срабатывает до достижения возраста 60 лет.
Законодательство, поданное представителем Брюса Эйерса из Куинси, отменяет возрастные ограничения для тех, у кого диагностирована болезнь Альцгеймера на ранней стадии. болезнь.
«Это небольшое население, но оно отчаянно нуждается в таких услугах», — сказал Айерс комитету.
Считается, что по всей стране от 200 000 до 240 000 человек страдают болезнью Альцгеймера на ранней стадии — примерно от 5 до 6 процентов всех случаев болезни Альцгеймера, согласно отчету клиники Мэйо.
Но горе, вызванное этой болезнью — и для трогательного описания этого мы отсылаем вас к статье в журнале Tom Keane’s Globe Magazine о диагнозе его жены, — не следует усугублять горечь от необходимости покинуть знакомое окружение из-за отсутствия доступного Сервисы.
Это решаемая проблема.
С другой стороны, жажда учиться у студентов с интеллектуальными нарушениями или тяжелым аутизмом — это не столько проблема, которую нужно «решить», сколько горизонт для расширения.
В конце концов, Инициатива по инклюзивному одновременному зачислению в Массачусетсе (MAICEI), которая финансирует партнерские отношения между местными школьными округами и государственными колледжами и университетами, позволяя учащимся с ограниченными интеллектуальными возможностями учиться, существует с 2007 года.Но программа грантов ограничена, и она меняется в зависимости от бюджетных ассигнований из года в год. В отчете программы за 2020 год отмечается, что она обслуживает около 8 процентов из примерно 2660 потенциально подходящих студентов, отчасти потому, что не все школьные округа хотят участвовать, а у некоторых нет кампусов колледжей поблизости.
Теперь группа законодателей хочет «кодифицировать» эту грантовую программу, сделав ее финансирование, которое выросло с 1 миллиона долларов в 2015 году до более чем 1,7 миллиона долларов, более последовательным. Они также хотят открыть двери государственного высшего образования для более широкой группы студентов, в том числе с умственными недостатками и аутизмом , которые не смогли сдать экзамен MCAS.Согласно закону, они смогут участвовать в качестве не зачисленных студентов, посещать курсы и участвовать во всех аспектах жизни университетского городка.
Брайан Хеффернан, который учился в муниципальном колледже MassBay по программе MAICEI и сейчас работает в Государственной палате, сказал Комитету по высшему образованию во вторник: «У меня была полноценная общественная жизнь. Я подружился там. Это изменило мою жизнь ».
Он посещал уроки общения и публичных выступлений и свидетельствовал о том, что научился пользоваться общественным транспортом, чтобы добраться до класса.Теперь он использует это, чтобы добраться до своей работы.
Мэтью Каллен рассказал комитету, как он наблюдал, как его друзья, его брат и сестра уходили в колледж: «И я сказал:« Почему я не могу этого сделать? »» Он поехал в штат Салем, где его любимый класс был публичным. Говорящий. Сегодня он работает на двух работах, добавляя: «Я готов к реальному миру».
Их истории и истории других студентов, дававших показания, не просто вдохновляют; они также свидетельствуют о том, что происходит, когда мы как общество повышаем, а не понижаем ожидания, и когда мы продолжаем открывать эти двери.
«Колледж трансформирует этих студентов», — засвидетельствовала Дебра Харт из Института социальной интеграции Университета Массачусетса в Бостоне. Она сообщила комитету, что на национальном уровне около 310 колледжей и университетов имеют программы приема студентов с ограниченными интеллектуальными возможностями.
«Через год после окончания колледжа 64 процента студентов имели оплачиваемую работу по сравнению с 18 процентами взрослых с нарушениями развития среди населения в целом», — сказала она. «Уровень занятости лиц с умственной отсталостью, поступивших в колледж, более чем в три раза выше.
Представитель Патриции Хаддад, соавтор законопроекта, которая настаивала на принятии закона в течение последних шести лет, заявила, что существующие партнерские отношения «не ослабили того, что происходит в этих колледжах», цитируя письма президентов нескольких из колледжи и университеты штата в поддержку ее законопроекта. «Мне кажется, что нет никаких причин не идти вперед с этим. . . . Больше, чем время «.
Это правда, на некоторые вещи нужно время. Но молодые люди с ограниченными интеллектуальными возможностями не должны отстаивать право добиваться большего.Точно так же, как людям с ранним началом болезни Альцгеймера не следует умолять остаться в собственных домах.
Некоторые вещи — то, что нужно делать. Эти счета — то, что нужно делать.
Передовицы представляют точку зрения редакционной коллегии Boston Globe. Следуйте за нами в Твиттере на @GlobeOpinion.
15 лучших способов научить ребенка писать
Последнее обновление
Придумывание того, как научить ребенка правильно писать слова, редко приходит в голову родителям, поскольку обычно считается, что это входит в обязанности школы.В то время как большинство дошкольных учреждений могут начать обучать детей простыми словами, настоящее обучение происходит, когда ваш ребенок возвращается домой и пытается вспомнить, чему его учили раньше. Тогда становится совершенно необходимо помочь вашему ребенку пересмотреть его уроки с использованием различных техник.
Почему важно учить детей правописанию?
Коммуникация — жизненно важный аспект нашей жизни, а орфография — это, по сути, то, как язык был создан в первую очередь. Детям необходимо правильно понимать написание.
Улучшенное чтение
Когда дети понимают, как писать слово, они лучше понимают его звучание, и это в конечном итоге помогает им лучше читать. Только с практикой они могут улучшить свою скорость чтения и даже попытаться понять новые слова.
Точное письмо
Представьте, что ваш ребенок начинает писать сообщения и письма другим людям с неправильным написанием. Это не только влияет на имидж вашего ребенка, но и препятствует росту его самооценки.
15 способов научить ребенка произносить слова
Обучение детей правильному написанию слов и повторению их без ошибок требует времени и практики. Чтобы обучение правописанию не наскучило вашему малышу и не заставило его повторяться, есть разные способы, с помощью которых вы можете сделать весь процесс написания слов интересным для него.
1. Произнеси слово, откуси
Хотя ваш ребенок может быстро уловить написание многих слов, ему может быть очень скучно повторять их каждый раз.Во время еды попросите ребенка произнести слово по буквам, а затем позвольте ему откусить от еды. Это может сделать вещи довольно интересными.
2. Создайте контекст для сложных слов
Некоторые слова звучат односторонне, но их написание совершенно иное. Сосредоточьтесь на буквах, которые сбивают с толку, и построите вокруг них рассказ. Например, у доктора стоит буква «с», потому что он видит болезнь.
3. Соединение разных слов вместе
Создайте игру, в которой ваш ребенок начинает с одного слова, а следующее должно начинаться с последней буквы предыдущего.Перед тем, как двигаться дальше, каждое новое слово нужно произносить правильно. Используйте кусочки бумаги, чтобы записать эти слова и сделать упражнение осязаемым.
4. Видео могут улучшить правописание
Вам не нужно постоянно находиться рядом с ребенком, чтобы помочь ему выучить правописание. Все, что вам нужно, это камера в телефоне, чтобы проводить приятные занятия. Запишите видеоролики о себе или своем ребенке, где вы упоминаете каждую букву, и ребенок должен закончить ее, произнеся слово, или наоборот.Повторный просмотр клипов будет для вас обоих весьма захватывающим.
5. Используйте флип-карты с изображениями
Вы можете использовать флип-карты для игры на память или даже сделать традиционный способ написания слов более интересным. Выберите слова, которые можно представить в виде изображений, и распечатайте их на карточках. Теперь нацарапайте их написание на обратной стороне или используйте отдельные карточки. Ваш ребенок может либо сопоставить их, либо выбрать карту и написать ее по буквам.
6. Охота за словом
Используйте абзацы из книг или газет и попросите ребенка найти в них определенные слова.Выявляя образцы слов из множества других, ребенок начинает лучше понимать написание.
7. Классики с правописанием
Сохраните набор слов, в которых столько букв, сколько стоит число на карте классиков. Дайте слово своему ребенку и позвольте ему рассказать его по буквам. Как только он это сделает, попросите его сосчитать буквы и перейти к этому конкретному числу.
8. Подбрасывание мяча для орфографии с друзьями
Когда друзья вашего ребенка собираются вместе, вы можете вовлечь их в игру, которая позволит им учить правописание на ходу.Произнесите слово и передайте мяч ребенку. Каждый ребенок должен произнести одну букву слова и передать мяч другому ребенку, который скажет следующую.
9. Используйте Scrabble для создания слов
По мере того, как ваш ребенок начинает учить больше слов, очень важно, чтобы его разум начал по-другому обрабатывать слова и их написание. Переверните столы, давая ему разные буквы, и позвольте ему сложить их вместе, чтобы образовать слово. Использование для этого Scrabble может быть довольно эффективным учебным занятием.
10. Используйте мобильные игры
Каждый ребенок найдет множество оправданий, чтобы избежать учебы, но дайте ему смартфон, и он будет играть с ним бесконечные часы. Используйте эту цифровую близость, чтобы помочь им подбирать новые слова и лучше понимать их написание. Прямо от Spelling City до Puzzlemaker существует множество других игр, которые могут помочь ребенку научиться писать слова.
11. Гонка до финиша
Возьмите две доски и дайте каждому ребенку или команде по цветной ручке.Все встают подальше от досок. Как только вы дадите им слово, детям нужно подбежать к доске и правильно нацарапать слово.
12. Превращение правописания в красочное занятие
Если ваш ребенок больше склонен к цвету или рисованию фигур и других существ, внесите этот забавный элемент в мир правописания. Пусть он нарисует животное, а затем напишет его имя под ним.
13. Классический БИНГО с изюминкой
Если ваш ребенок фанат таких игр, как BINGO или Tambola, вы можете создать головоломку со словами, которые он уже знает.Создайте сетку и заполните ее разными словами. В остальных пробелах могут быть случайные буквы. Попросите ребенка найти в сетке определенное слово и обвести его.
14. Трассировка, копирование, повтор
Эта трехшаговая техника весьма успешно помогает детям, которые не могут понять слова и их написание. Пусть они начнут с того, что проведут карандашом по существующим словам и поймут буквы. Далее следует копирование этих букв точно на отдельную страницу.Как только это будет сделано, скройте страницу и позвольте им повторять то же слово по памяти.
15. Одна буква за шаг
Совмещайте повторение написания в повседневных делах. Пока вы спускаетесь по лестнице, позвольте каждому шагу добавлять букву к существующему слову. Например, произнося слово «яблоко», начните с «а», затем «ап», затем «приложение» и так далее.
Хотя может быть сложно понять, как научить правописанию дошкольника или даже ребенка детского сада, лучший способ — это понять, как научить их правильному методу обучения.Как только эта проблема будет решена, вашему ребенку будет легче запоминать и вспоминать написание различных слов.
Также читайте: Как научить детей фонетике
.