Nano Hash - криптовалюты, майнинг, программирование

Какова логика проектирования фрагментов как статических внутренних классов по сравнению с автономными общедоступными классами?

Я не могу понять один важный аспект разработки программного обеспечения для Android, с которым я только начинаю, из того, что я знаю, Fragment дизайн был принят для того, чтобы отделить код, где интуиция такова, что Activity остается как есть, и Fragment может быть повторно использованным в другом месте, может быть, даже в другом действии, или, может быть, вместе с другими фрагментами, в чем-то вроде потока Master/Detail или ландшафтного пользовательского интерфейса.

Хорошо, поэтому я видел довольно много вопросов о SO, спрашивающих, почему Fragments помещаются как статические внутренние классы в Activity, и ответ заключается в том, что если мы не сделаем их статическими, Fragment может содержать ссылку на активность и что-то вроде поворота экрана или перерисовки может привести к утечке активности или что-то в этом роде.

Это возвращает меня к исходной точке, и у меня есть вопрос: ну, если дизайн фрагмента был принят для того, чтобы отделить код, то почему мы объединяем Fragment с Activity, помещая его внутри класс активности и не помещать их в отдельные публичные классы? Разве это не противоречит самому существованию Фрагментов?

Какова обратная сторона структуры проекта как таковой? Где каждый Fragment является отдельным классом? Учитывая, что мой код фрагмента может вырасти до 1000 строк, особенно при попытке сделать анимацию, я вижу это как гораздо более аккуратное, развязанное и повторно используемое в действиях, отличных от предполагаемого родительского действия.

  • Мы все еще страдаем от упомянутой выше проблемы с утечкой памяти?
  • Я что-то упустил в логике дизайна? Пожалуйста, просветите меня.
  • Есть ли способ, чтобы фрагменты оставались внутренним классом и по-прежнему использовались в других местах? Возможно, я тоже что-то упускаю... так что сообщите мне.

Структура проекта

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

Спасибо :)


  • Не могли бы вы добавить ссылку на один из ответов, пропагандирующих фрагменты как статические внутренние классы для действий. Звучит как абсурд. Я всегда отделял фрагменты от действий и помещал их в свои собственные классы и файлы .java без какой-либо утечки активности или другой подобной ерунды. 05.03.2014
  • @britzl, скажем, например, когда вы создаете новую активность в Android Studio, по умолчанию фрагмент (PlaceholderFragment) встраивается как статический внутренний класс в активность, мне приходится вручную вынимать его оттуда и помещать в свой собственный класс. Это поведение по умолчанию... что вызвало вопросы в моей голове. 05.03.2014
  • Также здесь, в официальной документации для фрагментов. developer.android.com/guide/components/fragments.html#Design общедоступный статический класс ExampleFragment расширяет фрагмент в разделе Добавление пользовательского интерфейса 05.03.2014
  • Ах, я не заметил общедоступной статической нотации класса в официальной документации. В любом случае, на мой взгляд, фрагменты следует рассматривать как повторно используемые части пользовательского интерфейса, либо для альбомного, либо для портретного режима, либо для использования в нескольких разных действиях. Конечно, иногда фрагмент используется только в одном действии, но в таком случае я задаюсь вопросом, почему он вообще был превращен во фрагмент. 05.03.2014
  • @Akay Вы правы, в документах Google внутри активности используется общедоступный статический класс, во многих образцах и фрагментах использование таких терминов, как транзакции фрагментов, в диспетчере фрагментов нелепо !!! я помню выражения фиксации и отката баз данных. На самом деле, мне не нравится архитектура Android, и команда архитекторов из Google может изучать дизайн и шаблоны, потому что Android для меня: Много строк кода для МЕНЬШИХ результатов!!! 03.04.2015

Ответы:


1

Это возвращает меня к исходной точке, и у меня возникает вопрос: ну, если дизайн фрагмента был принят для того, чтобы отделить код, то почему мы объединяем фрагмент с действием, помещая его в класс действия, а не помещая их как автономные общедоступные классы? Разве это не противоречит самому существованию Фрагментов?

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

Узнайте больше об философии проектирования фрагментов.

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

Один из часто встречающихся способов хранить фрагменты в отдельных классах, но близко к связанным действиям, например, использовать префикс именования, чтобы они сортировались вместе в алфавитных списках в одном пакете: например. FooActivity с FooDetailsFragment.

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

Просто постарайтесь быть последовательным, чтобы другие люди, читающие код, могли легко ориентироваться в кодовой базе, а метрика кода WTF/минута оставалась низкой.

Мы все еще страдаем от упомянутой выше проблемы с утечкой памяти?

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

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

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

Вы можете ссылаться на общедоступные внутренние классы с помощью точечной нотации Outer.Inner в коде или Outer$Inner с отражением (например, файлы XML).

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

05.03.2014
  • Спасибо, что нашли время, чтобы ответить мне, мне действительно было полезно, как вы разбили каждую часть моего вопроса. Одна из очевидных причин, по которой я спросил об этом, заключалась в том, что Android Studio по умолчанию создает все мои фрагменты и статические внутренние классы... Я не хотел перехитрить значение по умолчанию, не зная, что я делаю. Из вашего объяснения я чувствую, что Android Studio делает предположение, что фрагмент используется только для этого конкретного действия. 05.03.2014
  • Я бы действительно сослался на внутренние классы в самом коде внешнего класса. Мне трудно понять эту часть вашего ответа, что вы имели в виду? 06.09.2014
  • @Eddnav Если у вас есть OuterClass.InnerFragment, используйте только InnerFragment в пределах OuterClass. Фрагменты должны быть модульными; размещение их внутри какого-либо другого класса снижает модульность. 06.09.2014

  • 2

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

    Поэтому я проверяю http://developer.android.com/guide/components/fragments.html, который всегда стоит перечитать, и что вы знаете, пример внизу - это именно то, что вы предлагаете, и я использую каждый день: два общедоступных фрагмента в автономных классах, которые присоединены к действию и посредством действия.

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

    gl hf!

    05.03.2014
  • Как я упоминал в комментариях, моим источником является поведение Android Studio по умолчанию и части официальной документации. Хотя я нахожу это информативным, я использую интерфейс для общения с управляющей активностью, использую адаптеры для управления фрагментами и выполняю базовый учет, чтобы гарантировать, что я не запускаю несколько фоновых потоков из-за повторной загрузки. Не пробовал так делать. Посмотрим, улучшит ли это мою практику. 05.03.2014
  • Круто, да, не бойтесь отрываться от занятий; вообще говоря, возможность сделать это гарантирует вам, что объект, с которым вы играете, правильно сформирован и делает то, что вы думаете. Рассмотрим шаблоны проектирования контрактов: в идеальном мире каждый объект работает только с параметрами в конструкторе, статических объектах и ​​объектах, которые он создает. Фрагменты хорошо форсируют эту философию, а реализация интерфейсов — отличный способ не выходить за рамки, но делать то, что этому препятствует + система классов. 05.03.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..