Обзор атомарного дизайна и примеры на Flutter и Swift

Что такое атомный дизайн?

Думаю, вы слышали об этой методологии, которая делает программистов фронт-энда (мобильного и веб-программирования) почти супермощными. Atomic Design Брэда Фроста — это действительно очень хорошая архитектура и модель для создания сложных систем и устранения «боилрплейта», который мы часто видим, когда речь идет о том, чтобы привнести простоту в переднюю часть.

Цель — сделать нас более эффективными, чтобы мы могли сосредоточиться на главном. Мы должны стандартизировать то, что должно быть стандартизировано.

Примеры

Я работаю в среде с такой методологией и очень рекомендую ее. Компоненциализация, помимо полезности, при серьезном подходе может быть приятной и высокоэффективной, наличие человека, который активно заботится о компонентах проекта, может изменить производительность. В этой статье я не только расскажу, но и покажу примеры применения этой методологии. Чтобы узнать больше, всегда обращайтесь к первоисточнику, Брэд Фрост написал книгу в 2016 году, и она чрезвычайно современна. Давайте перейдем к коду, для начала я расскажу о коде на swift, который чрезвычайно прост, но в то же время содержит суть методологии.

Следующий код вдохновлен твитом, который я видел, где я обнаружил, что Ui создан очень красивым с таким небольшим количеством кода. Удивительный iOS-разработчик по имени @tgrapperon сделал вот это
Оригинал твита таков:

— Томас Грапперон (@tgrapperon)

Томас Грапперон
@tgrapperon
PSA: Если вы хотите получить «автоматическую» вибрацию при установке `.foregroundStyle` в `.secondary` над `Material` в SwiftUI, вам *необходимо* использовать новые модификаторы `.background` из iOS 15 для рисования фона.
В противном случае вы получите только ровный цвет.
#SwiftUI
01:28 AM — 17 Feb 2022

func glassText(text: String) -> some View {
    Text(text)
            .foregroundStyle(.secondary)
            .padding()
            .background(
                    .regularMaterial,
                    in: RoundedRectangle(
                            cornerRadius: 11,
                            style: .continuous
                    )
            )
            .shadow(radius: 11)
            .padding()
}

// Função que faz tela generica
struct ContentView: View {
    var body: some View {
        ZStack {
            HStack {
                glassText(text: "Manda") // uso do texto
                glassText(text: "Bala") // uso do texto
            }
                    .font(.largeTitle.weight(.black))
        }
                .frame(maxWidth: .infinity, maxHeight: .infinity)
                .background(
                        LinearGradient(colors: [.pink, .yellow],
                                startPoint: .topLeading,
                                endPoint: .bottomTrailing
                        ),
                        ignoresSafeAreaEdges: .all
                )
    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Простой пример атомной конструкции

Результат в виде пользовательского интерфейса

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

Сложность ?

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

class _WelcomePageState extends State<WelcomePage> {
  List<Page> pageContent = [
    Page("welcome-one.png", "Viaje", "Para as Montanhas",
        "Conhecer a natureza além de te dar a sensação de liberdade te fará muito mais feliz como pessoa."),
    Page("welcome-two.png", "Viva", "Os seus sonhos",
        "Essa experiencia mudará sua vida de formas que nunca antes você sentiu."),
    Page("welcome-three.png", "Aprenda", "Sobre as culturas",
        "Isso é único e apenas conhecendo outros lugares te darão isso."),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageView.builder(
          scrollDirection: Axis.vertical,
          itemCount: pageContent.length,
          itemBuilder: (_, index) {
            return AppCarrossel(
              bg: pageContent[index].bg,
              title: pageContent[index].title,
              subtitle: pageContent[index].subtitle,
              text: pageContent[index].text,
              currentIndex: index,
              pagesNumber: pageContent.length,
            );
          }),
    );
  }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Код со страницы регистрации вымышленного проекта

class AppCarrossel extends StatelessWidget {
  String bg;
  String title;
  String subtitle;
  String text;
  int pagesNumber;
  int currentIndex;

  AppCarrossel(
      {Key? key,
      required this.bg,
      required this.title,
      required this.subtitle,
      required this.text,
      required this.pagesNumber,
      required this.currentIndex})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.maxFinite,
      height: double.maxFinite,
      decoration: BoxDecoration(
          image: DecorationImage(
              fit: BoxFit.cover, image: AssetImage("img/" + bg))),
      child: Container(
        margin: const EdgeInsets.only(top: 120, left: 20, right: 20),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                AppLargeText(text: title),
                AppText(text: subtitle, size: 30),
                Container(
                  margin: EdgeInsets.only(top: 20, bottom: 40),
                  width: 250,
                  child: AppText(
                    text: text,
                    color: AppColors.textColor2,
                    size: 14,
                  ),
                ),
                ResponsiveButton(
                  width: 120,
                )
              ],
            ),
            Column(
              children: List.generate(pagesNumber, (indexDots) {
                return Container(
                  margin: EdgeInsets.only(bottom: 2),
                  width: 8,
                  height: currentIndex == indexDots ? 25 : 8,
                  decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(8),
                      color: currentIndex == indexDots
                          ? AppColors.mainColor
                          : AppColors.mainColor.withOpacity(0.8)),
                );
              }),
            )
          ],
        ),
      ),
    );
  }
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Компонент страницы «Карусель

Результат

Обратите внимание, что этот компонент, каким бы большим он ни был, получает данные только от «умного» компонента, а затем строит экран. Результат можно увидеть ниже:

— Габриэль Грубба λ (@que_cara_legal)

Габриэль Грубба λ
@que_cara_legal
учебник + активы от парня на YT, помощь от @wilcorrea , 45 минут и немного гугла было сделано оттуда.
Я так горжусь тобой.
11:04 PM — 13 Feb 2022

На кого это направлено?

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

Заключение

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

Оцените статью
devanswers.ru
Добавить комментарий