Advertisement
Guest User

Untitled

a guest
Sep 18th, 2024
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.20 KB | None | 0 0
  1. ---
  2. sidebar_position: 4
  3. sidebar_class_name: sidebar-item--wip
  4. pagination_next: reference/index
  5. ---
  6.  
  7. import WIP from '@site/src/shared/ui/wip/tmpl.mdx'
  8.  
  9. # Кросс-импорты
  10.  
  11. <WIP ticket="220" />
  12.  
  13. > Кросс-импорты появляются тогда, когда слой или абстракция начинает слишком сильно насыщаться логикой. Поэтому методология выделяет новые слои, которые разрешают связанные с ними проблемы.
  14.  
  15. ## Введение {#start}
  16.  
  17. Перед тем, как разбираться, как работать с кросс-импортами для соответствия методологии FSD, стоит разобраться, что такое "кросс-импорт" в принципе.
  18.  
  19. **Кросс-импорт** - ситуация, при которой внутри FSD слоя появилась необходимость импорта одного слайса в другой.
  20.  
  21. :::warning Важно
  22.  
  23. Речь в статье идёт только о конфликтных ситуациях при импортах между **слайсами**. Внутри одного слайса фрагменты не запрещено импортировать друг в друга.
  24.  
  25. :::
  26.  
  27. Рассмотрим абстрактный пример:
  28.  
  29. - `📂 entities`
  30.    - `📂 countries`
  31.   - `📁 lib`
  32.     - `📄 getCountriesList `
  33.    - `📁 cities`
  34.       - `📁 lib`
  35.     - `📄 getCitiesByCountryName`
  36.  
  37. В данном примере для вызова метода `getCitiesByCountryName` необходимо получить результат вызова метода `getCountriesList`.
  38. Получить результат работы метода `getCountriesList` напрямую нельзя, так как это нарушит принцип низкой связности и усложнит поддержку проекта в дальнейшем.
  39.  
  40. Как разрешать ситуации, когда появилась захотелось сделать кросс-импорт? Рассмотрим в этой статье. 
  41.  
  42. ## Варианты решения кросс-импортов {#solutions}
  43.  
  44. ### Объединение нескольких слайсов в один {#slices-merge}
  45. Как видно из примера выше, доменная область методов `getCitiesByCountryName` и `getCountriesList` похожа, а значит возможно создать один слайс из двух уже имевшихся, где оба метода хранились бы в одной директории
  46.  
  47. Результат объединения слайсов `countries` и `cities`:
  48. - `📂 entities`
  49.    - `📂 geography`
  50.   - `📁 lib`
  51.     - `📄 getCountriesList`
  52. - `📄 getCitiesByCountryName`
  53.  
  54. Как видно из примера, мы избавились от ситуации, когда один слайс импортирует данные из другого и достигли высокой сцепленности и низкой связности в рамках сегмента одного слайса
  55.  
  56. ### Разбиение слайсов на разные слои {#slices-moving}
  57. Данный вариант скорее подходит для тех случаев, для которых объединение нескольких слайсов в один затруднено или невозможно.
  58.  
  59. Вероятно, что слайс, который импортирует информацию из другого слайса сильно насыщен логически, и этот слайс стоит на слой выше, дабы устранить связность этих слайсов внутри одного слоя.
  60.  
  61. Результат разбиения слайсов `countries` и `cities` на разные слои:
  62. - `📂 entities`
  63.    - `📂 countries`
  64.   - `📁 lib`
  65.     - `📄 getCountriesList `
  66. - `📂 features`
  67.    - `📁 cities`
  68.       - `📁 lib`
  69.     - `📄 getCitiesByCountryName`
  70.  
  71. Переместив слайс `cities` на слой `features` (не обязательно на него, подойдёт любой слой выше по иерархии), мы более конкретно уточнили его доменную область и создали правильный с точки зрения иерархии слоёв механизм импортов.
  72.  
  73. ### Дублирование кода {#duplication-code}
  74. Если объем информации, который импортируется из другого слайса невелик, возможно стоит продублировать её в текущий слайс. Тем не менее, такой вариант не стоит рассматривать приоритетным над указанными выше.
  75.  
  76. ## А если кросс-импорт неизбежен? {#cross-import-is-inevitable}
  77.  
  78. :::caution Внимание
  79.  
  80. Информация в этом разделе **не является руководством к действию** и не отражает официальную позицию авторов методологии Feature Sliced Design.
  81. Тем не менее, в экзотических ситуациях, информация раздела может быть полезна
  82.  
  83. :::
  84.  
  85. Если в проекте необходим кросс-импорт и два описанных выше способа не помогли, сообщество Feature Sliced Design предлагает следующий вариант решения проблемы
  86.  
  87. - `📂 entities`
  88.    - `📂 countries`
  89.   - `📁 lib`
  90.     - `📄 getCountriesList `
  91.    - `@x`
  92.    - `📁 cities`
  93.       - `📁 lib`
  94.     - `📄 getCitiesByCountryName`
  95.    - `@x`
  96.  
  97. ### @x {#export-private-api}
  98. **@x** - это подход, когда внутри слайса возможно создать явный публичный экспорт только тех модулей, которые можно использовать в рамках нескольких слайсов одного слоя
  99.  
  100. Рассмотрим пример:
  101. ```ts title="entities/countries/@x.ts"
  102. export { getCountriesList } from './lib/getCountriesList.ts';
  103. ```
  104. Метод внутри слайса, которому необходим кросс-импорт:
  105. ```ts title="entities/cities/lib/getCitiesByCountryName"
  106. import { getCountriesList } from '/entities/countries/@x/getCountriesList';
  107.  
  108. const countries = getCountriesList();
  109.  
  110. const getCitiesByCountryName = (countryName: string) => {} // logic
  111.  
  112. return getCitiesByCountryName(countries[0]);
  113. ```
  114. Как видно по пути импорта в файле `getCitiesByCountryName`, благодаря экспорту из файла @x, явно видно, что данный модуль не предназначен для публичного использования, а существует только для того, чтобы быть импортированным внутрь другого слайса
  115.  
  116. ### Отмена запрета на кросс-импорты {#disable-cross-imports-rule}
  117. Если Вы попробовали все способы в статье, но по каким-либо причинам всё равно не смогли избавиться от кросс-импортов, возможно, стоить задуматься о том, чтобы снять запрет на них в рамках конкретных слайсов, либо всего проекта в целом.
  118. Однако, важно понимать, что отмена запрета на кросс-импорты, может негативно сказываться на общей структуре проекта. 
  119.  
  120. ## Полезные ссылки {#useful-links}
  121.  
  122. 1. Команда Feature Sliced Design разработала инструмент, позволяющий автоматически проверить наличие кросс-импортов в проекте: [Steiger](https://github.com/feature-sliced/steiger) 
  123. 2. Больше информации о правиле кросс-импортов: [Steiger-Forbidden-Imports](https://github.com/feature-sliced/steiger/blob/master/packages/steiger-plugin-fsd/src/forbidden-imports/README.md) 
  124.  
  125. ## См. также {#see-also}
  126.  
  127. - [(Тред) Про предполагаемую неизбежность кросс-импортов](https://t.me/feature_sliced/4515)
  128. - [(Тред) Про резолвинг кросс-импортов в сущностях](https://t.me/feature_sliced/3678)
  129. - [(Тред) Про кросс-импорты и ответственность](https://t.me/feature_sliced/3287)
  130. - [(Тред) Про импорты между сегментами](https://t.me/feature_sliced/4021)
  131. - [(Тред) Про кросс-импорты внутри shared](https://t.me/feature_sliced/3618)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement