Метод абстрагирования: метод абстрагирования | Перевод метод абстрагирования?

§ 2. Метод абстрагирования в логическом анализе причинно-следственных отношений . Юридическая логика

Логические методы установления причинной связи: единственного сходства, единственного различия, соединенный метод сходства и различия, сопутствующих изменений, остатков — это способы выделения из совокупности действующих факторов тех, которые могут быть причиной результата. Кроме того, не все детерминирующие факторы имеют значение для квалификации преступлений. Таковыми являются только конкретные поступки лиц, способных выступать в качестве субъектов преступлений. Полученный вывод в определенной степени относительный. Ни одно явление, рассматриваемое в качестве следствия, не может быть производным только одного фактора, в его основе всегда лежит взаимодействие нескольких из них. В системе взаимосвязанных обстоятельств одно признается причиной последствия, в то время как другие низводятся до роли условий, а то и вовсе исключаются. Так, рассматривая дело об убийстве, совершенном с применением огнестрельного оружия, нельзя признавать причиной смерти действие оружия, полет пули, состояние организма потерпевшего и другие обстоятельства, в частности предоставление оружия, боеприпасов, завлечение жертвы и т.

 д. Причиной смерти признается действие преступника. Между тем названные факторы тоже связаны с последствием, без них причина не могла быть реализована. Таким образом, в логическом процессе выявления причины осуществляется абстрагирование, отвлечение одних факторов от других, не являющихся причиной.

В большинстве преступлений абстрагирование не представляет сложности. Исходя даже из общего, элементарного житейского опыта можно прийти к выводу, что причиной убийства не могут быть средства, место, другие условия совершения преступления, равно как и физические свойства виновного и его жертвы; причиной кражи не может считаться слабая охрана объекта, ценность имущества и т. д. Однако отдельные преступления представляют собой сложную взаимосвязь событий, из которых порой трудно выделить причину.

Например, водитель автомашины А. выехал на левую сторону дороги, в связи с чем шофер встречной машины Б. свернул вправо, съехал в кювет, его машина опрокинулась и находившиеся в ней пассажиры получили телесные повреждения. Причиной наступивших последствий признаются действия А. Несмотря на то, что последствия непосредственно связаны с действиями водителя Б., тем не менее следует от этих действий абстрагироваться, отвести им второстепенную роль в причинении результата.

Такое решение основывается на нормативных особенностях причинных связей, действующих в социальных отношениях, которые характеризуются не только передачей материи и энергии от субъекта к объекту, но и нарушением субъектом установленного социальными нормами порядка поведения. Это нарушение может оказывать отрицательное управляющее информационное воздействие на материальные процессы, что также приводит к общественно опасным последствиям.

Метод абстрагирования характерен для установления причинной связи. «Чтобы познавать частности мы вынуждены вырывать их из их естественной или исторической связи и исследовать каждую в отдельности, по ее… особым причинам и следствиям»[5]. Далее: «…Человеческое понятие причины и следствия всегда несколько упрощает объективную связь явлений природы, лишь приблизительно отражая ее, искусственно изолируя те или иные стороны одного единого мирового процесса»[6]. Абстрагирование состоит в вырывании, искусственной изоляции явления и изучении его отдельно от других, связанных с ним явлений, с точки зрения причиняющей способности.

Абстрагирование имеет большое практическое значение, на основе этого принципа собственно и решается вопрос об ответственности лица за содеянное. Если бы не было возможности выделить путем абстрагирования главный фактор в системе взаимодействующих сил, то не было бы и возможности установить лицо, виновное в правонарушении. Причиной результата признавались бы вся совокупность факторов либо каждый из них в отдельности. Не исключено, что выделение среди них действий того или иного индивида носило бы произвольный характер.

Существуют два общих правила (условия) абстрагирования:

1. Причина должна качественно отличаться от других факторов, сопутствующих ей в данной пространственно-временной области.

2. Влияние сопутствующих факторов должно быть значительно менее интенсивным, чем воздействие причины на следствие, причем настолько, чтобы этими сопутствующими факторами можно было пренебречь без большого ущерба для результатов исследования.

Эти условия вытекают из рассмотренных выше методов научной индукции и должны соблюдаться при использовании каждого из них. Качественное отличие причины от сопутствующих факторов позволяет идентифицировать причину и следствие, найти в следствии часть причины: ее энергию, структуру. Так, характер телесных повреждений ставит их в зависимость от полученного ножевого ранения в том смысле, что ни один другой фактор (например нанесенные одновременно побои) не способен вызвать такие последствия.

Сложность представляет выявление степени интенсивности воздействующих факторов. Интенсивность не всегда пропорциональна физической силе, как в примере с ножевым ударом. Если, например, взрослый преступник уговаривает подростка проникнуть в магазин и похитить какой-то предмет, его действия признаются причиной хищения, хотя физическое воздействие взрослого на похищенный предмет может отсутствовать, и в этом случае вопрос об интенсивности воздействия вообще не возникает. В социальных отношениях, как упоминалось, управляющее воздействие субъекта имеет гораздо большее значение, чем физическое.

Благодаря руководящему положению субъекта в системе взаимодействующих факторов его поведение признается причиной наступивших последствий; несмотря на то, что непосредственное физическое изменение произведено другими факторами, последние выступают лишь в качестве средства достижения субъектом преступного результата.

Доведение сопутствующих факторов до ранга средства по отношению к определенному действию субъекта является одной из основных задач абстрагирования. Таким средством в приведенном примере с автопроисшествием признаны действия водителя Б. Если эта задача не выполнима, сопутствующие факторы нельзя игнорировать, они должны признаваться в качестве причины или одной из причин. Для выяснения действительной субординации, существующей между взаимосвязанными факторами, в определенных случаях необходимо обращаться к правовой характеристике субъекта, объему и характеру возложенных на него, но не выполненных им обязанностей.

2.

6. Методы, используемые на эмпирическом и теоретическом уровне исследований

Социальная работа / Методика исследований в социальной работе / 2.6. Методы, используемые на эмпирическом  и теоретическом уровне исследований

К таким методам принято относить абстрагирование, анализ и синтез, индукцию и дедукцию.

Абстрагирование носит в умственной деятельности универсальный характер, ибо каждый шаг мысли связан с этим процессом или с использованием его результата. Сущность этого метода состоит в мысленном отвлечении  от несущественных свойств, связей, отношений, предметов и в одновременном выделении, фиксировании одной или нескольких интересующих исследователя сторон этих  предметов.

Различают процесс абстрагирования и результат абстрагирования, называемый

 абстракцией. Обычно под результатом абстрагирования понимается знание о некоторых сторонах объектов. Процесс абстрагирования – это совокупность операций, ведущих к получению такого результата (абстракции). Примерами абстракций могут служить бесчисленные понятия, которыми оперирует человек не только в науке, но и в обыденной жизни: дерево, дом, дорога и т.п.

Процесс абстрагирования в системе логического мышления тесно связан с другими методами исследования и, прежде всего,  с анализом и синтезом.

Анализ является методом научного исследования путем разложения предмета на составные части. Синтез представляет соединение полученных при анализе частей в нечто целое. Методы анализа и синтеза в научном творчестве органически  связаны между собой и могут принимать различные формы в зависимости от свойств изучаемого объекта и цели исследования.

Прямой или эмпирический анализ и синтез применяется на стадии поверхностного ознакомления с объектом. При этом осуществляется выделение отдельных частей объекта, обнаружение его свойств, простейшие измерения, фиксация непосредственно данного, лежащего на поверхности общего. Этот  вид анализа и синтеза дает возможность познать явление, но для проникновения в его сущность он недостаточен.

Возвратный или элементарно-теоретический анализ и синтез широко используется как мощное орудие достижения моментов сущности исследуемого явления. Здесь операции анализа и синтеза осуществляются не механически. Они базируются на теоретических соображениях, в качестве которых может выступать предположение о причинно-следственной связи различных явлений, о действии какой-либо  закономерности.

Метод индукции и дедукции.

С помощью индукции (от. лат. — наведение) обеспечивается переход  от изучения единичных фактов к общим положениям и выводам. Дедукция (от лат. — выведение) делает возможным переход от наиболее общих выводов к относительно частным.

Для исследования сложных развивающихся объектов применяется  исторический метод.  Он используется только там, где предметом исследования становится история объекта. Историческое исследование не только выявляет социальные закономерности возникновения, становления и развития явлений в контексте исторического времени, но и помогает разложить действующие в его процессах социальные силы, проблемы на составляющие, выявить их последовательность, определить приоритеты.

Из методов теоретического исследования рассмотрим  метод восхождения от абстрактного к конкретному.  Этот метод представляет собой всеобщую форму движения научного познания, закон  отображения  действительности в мышлении. Согласно методу восхождения от абстрактного к конкретному процесс познания как бы разбивается на два относительно самостоятельных этапа.

На первом этапе происходит переход от чувственно-конкретного, от конкретного в действительности к его абстрактным определениям. Единый объект расчленяется, описывается при помощи множества понятий и суждений. Он как бы «испаряется», превращаясь в совокупность зафиксированных мышлением абстракций, односторонних определений. Второй этап познания и есть восхождение от абстрактного к конкретному. Суть его – движение мысли от абстрактных определений  объекта, т.е. от абстрактного в познании, к конкретному в познании. На этом этапе как бы восстанавливается исходная целостность объекта, он воспроизводится во всей своей многогранности – но уже в мышлении.

Оба этапа познания теснейшим образом взаимосвязаны. Восхождение от абстрактного к конкретному невозможно без предварительного «анатомирования» объекта мыслью, без восхождения от конкретного в действительности к абстрактным  его определениям.  Таким образом, можно сказать, что рассматриваемый метод представляет собой процесс познания, согласно которому  мышление восходит от конкретного в действительности к абстрактному в мышлении и от него  – к конкретному в мышлении.

Метод абстракции | Этика информации

Фильтр поиска панели навигации Oxford AcademicЭтика информацииМоральная философияФилософия наукиПрактическая этикаКнигиЖурналы Термин поиска мобильного микросайта

Закрыть

Фильтр поиска панели навигации Oxford AcademicЭтика информацииМоральная философияФилософия наукиПрактическая этикаКнигиЖурналы Термин поиска на микросайте

Расширенный поиск

  • Иконка Цитировать Цитировать

  • Разрешения

  • Делиться
    • Твиттер
    • Подробнее

CITE

Floridi, Luciano,

‘Метод абстракции’

,

Этика информации

(

Oxford,

2013;

онлайн Edn,

Oxford

,

, EDN,

Acadecra

,

. январь 2014 г.

), https://doi.org/10.1093/acprof:oso/9780199641321.003.0003,

, по состоянию на 9 января 2023 г.

Выберите формат Выберите format.ris (Mendeley, Papers, Zotero).enw (EndNote).bibtex (BibTex).txt (Medlars, RefWorks)

Закрыть

Фильтр поиска панели навигации Oxford AcademicЭтика информацииМоральная философияФилософия наукиПрактическая этикаКнигиЖурналы Термин поиска мобильного микросайта

Закрыть

Фильтр поиска панели навигации Oxford AcademicЭтика информацииМоральная философияФилософия наукиПрактическая этикаКнигиЖурналы Термин поиска на микросайте

Advanced Search

Abstract

В этой главе я представляю упрощенную версию метода (уровней) абстракции (LoA), который будет использоваться в остальной части книги. Глава разделена на две части. Первая часть представляет собой краткое введение в метод абстракции. Хотя определения требуют некоторой строгости, все основные понятия вводятся без каких-либо предварительных знаний. Определения иллюстрируются некоторыми простыми примерами, которые призваны ознакомить читателя с методом. Сравнение уровней абстракции и интерфейсов также проводится для того, чтобы сделать метод более доступным и легко применимым в следующих анализах. Во второй части представлено подробное применение метода к анализу телеприсутствия (называемого просто 9).0073 присутствие , если этот термин не вызывает путаницы).

Ключевые слова: уровни абстракции, онтологическая приверженность, виртуальная порнография, телеприсутствие, информационная конфиденциальность

Предмет

Философия наукиПрактическая этикаМоральная философия

В настоящее время у вас нет доступа к этой главе.

Войти

Получить помощь с доступом

Получить помощь с доступом

Доступ для учреждений

Доступ к контенту в Oxford Academic часто предоставляется посредством институциональных подписок и покупок. Если вы являетесь членом учреждения с активной учетной записью, вы можете получить доступ к контенту одним из следующих способов:

Доступ на основе IP

Как правило, доступ предоставляется через институциональную сеть к диапазону IP-адресов. Эта аутентификация происходит автоматически, и невозможно выйти из учетной записи с IP-аутентификацией.

Войдите через свое учреждение

Выберите этот вариант, чтобы получить удаленный доступ за пределами вашего учреждения. Технология Shibboleth/Open Athens используется для обеспечения единого входа между веб-сайтом вашего учебного заведения и Oxford Academic.

  1. Щелкните Войти через свое учреждение.
  2. Выберите свое учреждение из предоставленного списка, после чего вы перейдете на веб-сайт вашего учреждения для входа.
  3. При посещении сайта учреждения используйте учетные данные, предоставленные вашим учреждением. Не используйте личную учетную запись Oxford Academic.
  4. После успешного входа вы вернетесь в Oxford Academic.

Если вашего учреждения нет в списке или вы не можете войти на веб-сайт своего учреждения, обратитесь к своему библиотекарю или администратору.

Войти с помощью читательского билета

Введите номер своего читательского билета, чтобы войти в систему. Если вы не можете войти в систему, обратитесь к своему библиотекарю.

Члены общества

Доступ члена общества к журналу достигается одним из следующих способов:

Войти через сайт сообщества

Многие общества предлагают единый вход между веб-сайтом общества и Oxford Academic. Если вы видите «Войти через сайт сообщества» на панели входа в журнале:

  1. Щелкните Войти через сайт сообщества.
  2. При посещении сайта общества используйте учетные данные, предоставленные этим обществом. Не используйте личную учетную запись Oxford Academic.
  3. После успешного входа вы вернетесь в Oxford Academic.

Если у вас нет учетной записи сообщества или вы забыли свое имя пользователя или пароль, обратитесь в свое общество.

Войти с помощью личного кабинета

Некоторые общества используют личные аккаунты Oxford Academic для предоставления доступа своим членам. Смотри ниже.

Личный кабинет

Личную учетную запись можно использовать для получения оповещений по электронной почте, сохранения результатов поиска, покупки контента и активации подписок.

Некоторые общества используют личные аккаунты Oxford Academic для предоставления доступа своим членам.

Просмотр учетных записей, вошедших в систему

Щелкните значок учетной записи в правом верхнем углу, чтобы:

  • Просмотр вашей личной учетной записи и доступ к функциям управления учетной записью.
  • Просмотр институциональных учетных записей, предоставляющих доступ.

Выполнен вход, но нет доступа к содержимому

Oxford Academic предлагает широкий ассортимент продукции. Подписка учреждения может не распространяться на контент, к которому вы пытаетесь получить доступ. Если вы считаете, что у вас должен быть доступ к этому контенту, обратитесь к своему библиотекарю.

Ведение счетов организаций

Для библиотекарей и администраторов ваша личная учетная запись также предоставляет доступ к управлению институциональной учетной записью. Здесь вы найдете параметры для просмотра и активации подписок, управления институциональными настройками и параметрами доступа, доступа к статистике использования и т. д.

Покупка

Наши книги можно приобрести по подписке или приобрести в библиотеках и учреждениях.

Информация о покупке

Ваши методы должны быть «одноуровневыми» Long

Большинство разработчиков программного обеспечения признают, что методы в их коде не должны занимать сотни строк кода (не говоря уже о тысячах). Это один из немногих принципов кодирования, по поводу которого мы, разработчики, пришли к единому мнению. Однако, когда дело доходит до указания длины методов, этот хрупкий консенсус рушится: некоторые говорят, что методы должны помещаться на одном экране; другие ограничивают количество строк определенным числом; разработчики, ориентированные на познание, предполагают, что методы должны быть достаточно короткими, чтобы уместиться в вашей голове; и подходов больше.

Я редко задумываюсь о длине своих методов. Вместо этого я подчиняюсь другому, более важному принципу, который имеет приятный побочный эффект естественного создания более коротких методов. Этот принцип называется принципом единого уровня абстракции (SLAP).

Как следует из названия, принцип единого уровня абстракции гласит, что каждый метод в кодовой базе должен иметь дело с концепциями, относящимися только к одному уровню абстракции. Без смешивания. Звучит просто, но на практике применить этот принцип в реальном коде может быть сложно, потому что он… ну, абстрактный. Поэтому в этом посте я объясню, что означает принцип единого уровня абстракции, и покажу несколько примеров его применения в коде.

Абстракция

Абстракция — это то, что скрывает ненужную информацию. Это определение может показаться совершенно непрактичным, поэтому позвольте мне продемонстрировать, что делают абстракции, на простой аналогии.

При взаимодействии с компьютером вы используете экран, клавиатуру, мышь и другие периферийные устройства. Вам плевать на пластик, стекло, печатные платы, конденсаторы, чипы, вентиляторы и т. д. И уж точно плевать на транзисторы. Все эти низкоуровневые детали, какими бы важными они ни были для работающего компьютера, не имеют значения, когда вы работаете или играете в игры. В этом примере внешние устройства ввода-вывода вашего компьютера, а также его внешнее физическое тело являются абстракциями. Они скрывают от вас большую часть низкоуровневых сведений и предоставляют минимальный объем информации и функций, которые позволяют вам использовать компьютер.

Подумайте вот о чем: если бы нам нужно было понять хотя бы 1% сложности наших компьютеров, прежде чем мы сможем их использовать, большинство людей не смогли бы написать и одной строки текста. Следовательно, абстракции не являются необязательными или второсортными конструкциями. Это обязательные инструменты. Фактически, для большинства пользователей абстракции более высокого уровня (например, веб-сайт) гораздо более реальны, чем любые детали более низкого уровня (например, передача данных).

Исходный код также использует мощь абстракций. Например, класс скрывает большую часть своей сложности от внешнего мира и предоставляет простой набор функций (надеюсь) в форме своего общедоступного API. Итак, класс — это абстракция. Но методы также являются абстракциями, поскольку они также скрывают большую часть своей сложности. А исходный код сам по себе является абстракцией, потому что он позволяет вам использовать такие операторы, как 9.0189 если или вместо , не имея дело с инструкциями, счетчиками программ, регистрами и т.д.

В общем, везде мы видим абстракции «над» другими абстракциями. Эта прогрессия «уровней абстракции» продолжается и продолжается, и продолжается. Даже транзисторы, которые мы часто рассматриваем как самые фундаментальные компоненты компьютерной инженерии, являются абстракциями более низкого уровня концепций EE и физики твердого тела.

Принцип единого уровня абстракции (SLAP)

Вернемся к SLAP, который выступает за то, чтобы каждый метод в вашей кодовой базе имел дело только с одним уровнем абстракции.

Это определение может показаться странным, потому что в предыдущем разделе я сказал, что метод сам по себе является абстракцией. Итак, разве метод не имеет дело с тем уровнем абстракции, который связан с тем, что он является методом? Ну в общем то верно. Однако, как и экран, который может одновременно отображать информацию и вводить данные, один объект может представлять разные абстракции, если смотреть с разных точек зрения. Таким образом, метод действительно является абстракцией сам по себе. Это верно со «структурной» точки зрения, если рассматривать его как одну из языковых конструкций. Однако SLAP рассматривает метод как контейнер для кода, который манипулирует другими концептуальными абстракциями, связанными с функциями приложения.

Согласно SLAP, исходный код внутри каждого метода должен относиться к концепциям и механизмам, относящимся только к одному уровню «оперативной сложности» вашего приложения. Например, если метод создает и выполняет HTTP-запросы, он также не должен обрабатывать полученный JSON. Это разные уровни абстракции: один касается связи по HTTP, а другой — определенного формата данных и макета.

В следующих разделах я покажу несколько примеров кода, которые прояснят для вас SLAP.

Рефакторинг для SLAP — пример 1

Рассмотрим этот метод из официального приложения Google IO Scheduler:

 override fun toggleFilter(filter: Filter, enabled: Boolean) {
        если (фильтр !in _filters) {
            throw IllegalArgumentException("Неподдерживаемый фильтр: $filter")
        }
        значение изменено = если (включено) {
            _selectedFiltersList. add(фильтр)
        } еще {
            _selectedFiltersList.remove(фильтр)
        }
        если (изменено) {
            _selectedFilterChipsList =
                _selectedFiltersList.mapTo(mutableListOf()) { it.asChip(true)}
            val index = _filterChipsList.indexOfFirst { it.filter == filter }
            _filterChipsList[index] = filter.asChip(включено)
            опубликовать (правда)
        }
    } 

Имя toggleFilter , так что мы уже можем понять, что он делает. Первый оператор if проверяет недопустимый аргумент. Второй оператор if либо добавляет, либо удаляет фильтр, поэтому он связан с фильтрами. Однако реализация этого оператора показывает нам, что фильтры хранятся в каком-то списке. Не критично, но, строго говоря, что-то «переключить» и что-то «добавить» — это не совсем один уровень абстракции. И, наконец, если вторые , если приводит к изменению, код переходит в третье условие , если . Этот последний блок кода содержит некоторые низкоуровневые манипуляции, которые не читаются естественно для нетренированного глаза. Поэтому сразу не понять, что такое полный высокоуровневый поток «переключения».

Этот код нарушает SLAP, так что давайте это исправим. Вот с чем я пришел:

 override fun toggleFilter(filter: Filter, enabled: Boolean) {
        если (фильтр !in _filters) {
            throw IllegalArgumentException("Неподдерживаемый фильтр: $filter")
        }
        если (включено) {
            добавить фильтр (фильтр)
        } еще {
            удалить фильтр (фильтр)
        }
    }
    частное развлечение addFilter(filter: Filter) {
        если (_selectedFiltersList.add (фильтр)) {
            updateFilterChips (фильтр, правда)
        }
    }
    частная забава removeFilter (фильтр: фильтр) {
        если (_selectedFiltersList. remove (фильтр)) {
            updateFilterChips (фильтр, ложь)
        }
    }
    приватное удовольствие updateFilterChips(filter: Filter, isSelected: Boolean) {
        _selectedFilterChipsList =
            _selectedFiltersList.mapTo(mutableListOf()) { it.asChip(true)}
        val index = _filterChipsList.indexOfFirst { it.filter == filter }
        _filterChipsList[index] = filter.asChip(isSelected)
        опубликовать (правда)
    } 

Теперь у нас есть явное «переключение», «добавление» и «удаление» функций. Кроме того, читая исходный код, я понял, что существует абстракция под названием «чипы фильтра», которая отличается от «фильтра». Я не знаю, что это значит (и мне все равно), но, согласно SLAP, манипуляции над этой абстракцией также должны быть извлечены в отдельный метод. Так я и сделал.

Я нахожу версию, следующую за SLAP, более чистой и более читабельной. Теперь, читая этот код, я знаю, когда я перехожу от уровня абстракции «фильтр» к уровню «чипов фильтра», поэтому я могу просто остановиться, если мне не интересно пересекать эту границу. И, конечно же, все эти действия готовы к повторному использованию по желанию, если это потребуется в будущем.

Пожалуйста, обратите внимание, что первоначальная версия не была чрезмерно длинной, поэтому я, вероятно, счел бы нормальным, если бы я оценивал свои методы только по количеству строк кода. Это показывает, насколько мощнее SLAP по сравнению с подсчетом строк.

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

Рефакторинг для SLAP — пример 2

Второй пример — еще один метод из того же приложения Google IO:

 private fun showFeedItems(recyclerView: RecyclerView, list: List?) {
        если (адаптер == ноль) {
            val sectionHeaderViewBinder = FeedSectionHeaderViewBinder()
            val countdownViewBinder = CountdownViewBinder()
            val momentViewBinder = MomentViewBinder(
                прослушиватель событий = модель,
                информация о пользователе = модель. Информация о пользователе,
                тема = модель.тема
            )
            val sessionViewBinder = FeedSessionsViewBinder(модель)
            val feedAnnouncementsHeaderViewBinder =
                ОбъявленияHeaderViewBinder(это, модель)
            val обьявлениеViewBinder = AnnouncementViewBinder(model.timeZoneId, это)
            val аннонсемптивиевбиндер = аннонсментсэмптивиевбиндер()
            val-announcementsLoadingViewBinder = AnnouncementsLoadingViewBinder()
            val feedSustainabilitySectionViewBinder = FeedSustainabilitySectionViewBinder()
            val feedSocialChannelsSectionViewBinder = FeedSocialChannelsSectionViewBinder()
            @Suppress("НЕПРОВЕРЕННЫЙ_КАСТ")
            val viewBinders = ImmutableMap.builder()
                .помещать(
                    sectionHeaderViewBinder.modelClass,
                    sectionHeaderViewBinder как FeedItemBinder
                )
                .помещать(
                    обратный отсчетViewBinder. modelClass,
                    countdownViewBinder как FeedItemBinder
                )
                .помещать(
                    моментViewBinder.modelClass,
                    momentViewBinder как FeedItemBinder
                )
                .помещать(
                    сеансыViewBinder.modelClass,
                    sessionViewBinder как FeedItemBinder
                )
                .помещать(
                    каналобъявленийHeaderViewBinder.modelClass,
                    feedAnnouncementsHeaderViewBinder как FeedItemBinder
                )
                .помещать(
                    объявлениеViewBinder.modelClass,
                    объявлениеViewBinder как FeedItemBinder
                )
                .помещать(
                    объявленияEmptyViewBinder.modelClass,
                    объявленияEmptyViewBinder как FeedItemBinder
                )
                .помещать(
                    объявленияLoadingViewBinder.modelClass,
                    объявленияLoadingViewBinder как FeedItemBinder
                )
                . помещать(
                    feedSustainabilitySectionViewBinder.modelClass,
                    feedSustainabilitySectionViewBinder как FeedItemBinder
                )
                .помещать(
                    feedSocialChannelsSectionViewBinder.modelClass,
                    feedSocialChannelsSectionViewBinder как FeedItemBinder
                )
                .строить()
            адаптер = FeedAdapter (viewBinders)
        }
        если (recyclerView.adapter == ноль) {
            recyclerView.adapter = адаптер
        }
        (recyclerView.adapter как FeedAdapter).submitList(list ?: emptyList())
        // После отправки списка в адаптер представление переработчика начинает измерение и рисование
        // поэтому давайте подождем, пока макет будет отрисован, прежде чем сообщать о полной отрисовке.
        привязка.recyclerView.doOnLayout {
            // reportFullyDrawn() печатает `I/ActivityTaskManager: Полностью нарисовано {активность} {время}`
            // в логкэт.  Платформа гарантирует, что оператор печатается только один раз за
            // активности, поэтому нет необходимости добавлять в приложение логику дедупликации.
            активность?.reportFullyDrawn()
        }
    } 

Теперь, даже если бы разработчики никогда не слышали о SLAP, этот метод все равно нарушил бы любой разумный предел максимальной длины. В некоторых случаях длинные методы неизбежны (например, длинный блок switch с десятками или даже сотнями случаев), но это не один из них. Это просто грязный код, так что давайте позаботимся об этом.

Большая часть кода этого метода находится внутри начальной проверки if , которая завершается записью в переменную адаптера . Другими словами, большинство из showFeedItems Тело метода не имеет дело ни с лентой, ни с элементами, а с более низкоуровневыми деталями инициализации адаптера. Затем у нас есть еще одно условие if, которое очень озадачивает, потому что оно кажется ненужным и, опять же, имеет дело с адаптером. Затем у нас есть одна строка кода, которая (наконец) связана с абстракцией элементов канала и использует список, переданный в метод, за которым следует какой-то сильно закомментированный и малопонятный код более низкого уровня. В общем, внутри этого метода всего одна строчка кода, напрямую связанная с уровнем абстракции, указанным в его названии. Грязный.

Вот что у меня получилось после рефакторинга по SLAP:

 private fun showFeedItems(list: List?) {
        обеспечитьFeedUiInitialized()
        bindFeedItemsToAdapter (список ?: пустой список ())
        отчетFullyDrawnAfterFeedItemsDrawn()
    }
    приватное развлечение
        если (адаптер == ноль) {
            val viewBinders = инициализироватьViewBinders()
            адаптер = FeedAdapter (viewBinders)
        }
        если (recyclerView. adapter == ноль) {
            recyclerView.adapter = адаптер
        }
    }
    частная забава initializeViewBinders () {
        val sectionHeaderViewBinder = FeedSectionHeaderViewBinder()
        val countdownViewBinder = CountdownViewBinder()
        val momentViewBinder = MomentViewBinder(
            прослушиватель событий = модель,
            информация о пользователе = модель.Информация о пользователе,
            тема = модель.тема
        )
        val sessionViewBinder = FeedSessionsViewBinder(модель)
        val feedAnnouncementsHeaderViewBinder =
            ОбъявленияHeaderViewBinder(это, модель)
        val обьявлениеViewBinder = AnnouncementViewBinder(model.timeZoneId, это)
        val аннонсемптивиевбиндер = аннонсментсэмптивиевбиндер()
        val-announcementsLoadingViewBinder = AnnouncementsLoadingViewBinder()
        val feedSustainabilitySectionViewBinder = FeedSustainabilitySectionViewBinder()
        val feedSocialChannelsSectionViewBinder = FeedSocialChannelsSectionViewBinder()
        @Suppress("НЕПРОВЕРЕННЫЙ_КАСТ")
        val viewBinders = ImmutableMap. builder()
            .помещать(
                sectionHeaderViewBinder.modelClass,
                sectionHeaderViewBinder как FeedItemBinder
            )
            .помещать(
                обратный отсчетViewBinder.modelClass,
                countdownViewBinder как FeedItemBinder
            )
            .помещать(
                моментViewBinder.modelClass,
                momentViewBinder как FeedItemBinder
            )
            .помещать(
                сеансыViewBinder.modelClass,
                sessionViewBinder как FeedItemBinder
            )
            .помещать(
                каналобъявленийHeaderViewBinder.modelClass,
                feedAnnouncementsHeaderViewBinder как FeedItemBinder
            )
            .помещать(
                объявлениеViewBinder.modelClass,
                объявлениеViewBinder как FeedItemBinder
            )
            .помещать(
                объявленияEmptyViewBinder.modelClass,
                объявленияEmptyViewBinder как FeedItemBinder
            )
            . помещать(
                объявленияLoadingViewBinder.modelClass,
                объявленияLoadingViewBinder как FeedItemBinder
            )
            .помещать(
                feedSustainabilitySectionViewBinder.modelClass,
                feedSustainabilitySectionViewBinder как FeedItemBinder
            )
            .помещать(
                feedSocialChannelsSectionViewBinder.modelClass,
                feedSocialChannelsSectionViewBinder как FeedItemBinder
            )
            .строить()
        вернуть viewBinders
    }
    частное развлечение bindFeedItemsToAdapter(feedItems: List) {
        (binding.recyclerView.adapter as FeedAdapter).submitList(feedItems)
    }
    частный отчет о развлеченияхFullyDrawnAfterFeedItemsDrawn() {
        // После отправки списка в адаптер представление переработчика начинает измерение и рисование
        // поэтому давайте подождем, пока макет будет отрисован, прежде чем сообщать о полной отрисовке.
        привязка.recyclerView.doOnLayout {
            // reportFullyDrawn() печатает `I/ActivityTaskManager: Полностью нарисовано {активность} {время}`
            // в логкэт.  Платформа гарантирует, что оператор печатается только один раз за
            // активности, поэтому нет необходимости добавлять в приложение логику дедупликации.
            активность?.reportFullyDrawn()
        }
    } 

После этого рефакторинга становится очень ясно, что происходит, когда мы хотим показать элементы ленты. Большая часть кода теперь находится внутри метода, в котором четко указано, что он имеет дело с абстракцией «привязки представлений», поэтому вы можете пропустить его при чтении кода, если вас не интересует такой уровень детализации. Обратите внимание, что этот метод initializeViewBinders по-прежнему относительно длинный, но это совершенно нормально, поскольку он имеет дело только с одним уровнем абстракции. Разделение этого метода на самом деле не имело бы смысла, потому что это привело бы к фрагментации композиции 9.0189 Сопоставить структуру данных без усиления. Следовательно, следование SLAP в этом случае автоматически создает оптимальный код.

Как и прежде, для протокола скажу, что код после рефакторинга все еще не чист. Опытные разработчики Android заметят, что то, как они работают с адаптером, бессмысленно, и в коде есть ненужные типы, допускающие значение NULL, но ничего из этого не связано с SLAP.

Заключение

Принцип единого уровня абстракции является исключительно мощной эвристикой для написания чистого кода. Это приводит к более простому, более читаемому и более пригодному для повторного использования коду, а также освобождает вас от необходимости думать о длине ваших методов.

Преимущества SLAP становятся еще более очевидными при рефакторинге унаследованного кода, поскольку SLAP помогает вам выполнять множество небольших поэтапных рефакторингов, которые вы можете легко реализовать. Эти небольшие шаги со временем приведут к сложному проценту и могут превратиться в серьезные архитектурные улучшения.

Поскольку «абстракции» в вашем коде не определены точно, SLAP не является точной наукой.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *