Как создать класс в андроид студио

Обновлено: 13.05.2024

Для тех случаев, когда вы хотите изолировать Java и быстро его протестировать.

Можете ли вы запускать не Android-проекты Java в Android-студии, как в Eclipse?

Android-студия основана на IntelliJ. Конечно, он способен запускать «стандартный» код Java. Но зачем тебе это? @vmironov Это по сути то, что они делают. Функции Android - это плагин IntelliJ, они просто упаковывают его вместе для Android Studio. В частности, я не использовал Android Studio, но некоторое время пользуюсь IntelliJ, и у вас не должно возникнуть проблем при запуске стандартных Java-проектов внутри него. @kcoppock, да, но этот плагин не может быть добавлен к "обычной" IntelliJ IDEA (у меня есть купленная версия Ultimate, и я не хочу переключаться обратно на версию Community). Хорошая новость заключается в том, что JetBrains объявила о том, что в Intellij IDEA 13 будут доступны функции Android Studio Есть ли простой способ заставить его работать с Gradle? Я продолжаю падать, потому что он не видит мои библиотеки gradle во время выполнения.

Проверено на Android Studio 0.8.6 - 3.5

Используя этот метод, вы можете иметь модули Java и модули Android в одном проекте, а также иметь возможность компилировать и запускать модули Java как отдельные проекты Java.

  1. Откройте свой проект Android в Android Studio. Если у вас его нет, создайте его.
  2. Нажмите Файл> Новый модуль . Выберите библиотеку Java и нажмите « Далее» .
  3. Введите имя пакета и т. Д. И нажмите Готово . Теперь вы должны увидеть модуль Java внутри вашего проекта Android.
  4. Добавьте свой код в модуль Java, который вы только что создали.
  5. Нажмите на выпадающий слева от кнопки запуска. Нажмите Редактировать конфигурации .
  6. В новом окне нажмите на знак плюс в левом верхнем углу окна и выберите Приложение
  7. Должна появиться новая конфигурация приложения, введите такие данные, как ваш основной класс и путь к классу вашего модуля.
  8. Нажмите ОК .

Теперь, если вы нажмете Run, это должно скомпилировать и запустить ваш модуль Java.

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

НОВОЕ - Как включить Kotlin в вашем автономном проекте

Если вы хотите включить Kotlin в вашем автономном проекте, сделайте следующее.

Продолжая с последнего шага выше, добавьте следующий код на уровень вашего проекта build.gradle (строки для добавления обозначены >>> ):

Добавьте следующий код на уровень вашего модуля build.gradle (строки для добавления обозначены >>> ):

Бонусный шаг: превратите свою основную функцию в Kotlin! Просто измените свой основной класс на:

Я могу подтвердить это работает в Android Studio 0.8.14. Я использовал базовый проект Hello World и добавил класс Custom, содержащий метод main. Я удалил файл MainActivity.java. На шаге 2 мне нужно было открыть панель «Больше модулей» (внизу слева от окна «Создать новый модуль») и прокрутить вниз, чтобы найти элемент библиотеки Java. На шаге 6 я назвал свое приложение, выбрал Custom в качестве основного класса и app для пути к классам модуля. ПРИМЕЧАНИЕ. Если вы удалите модуль приложения в соответствии с решением @ simonp, ваше приложение будет работать, но с ошибками. Но как я могу экспортировать проект рабочего стола в файл .jar? Я нигде не могу найти этот вариант: / работал отлично! Я использовал Android Studio 3.1.4. Спасибо, что поделился !

РЕДАКТИРОВАТЬ: многие луна после того, как этот вопрос был задан, да, теперь, видимо, вы можете.

Нет, но он основан на Intellij IDEA.

Общественная версия бесплатна для скачивания, но не поддерживает большинство вещей, требующих внешней базы данных или сервера приложений. Линия для Java в значительной степени такова, что код JavaSE может с удовольствием использовать Community.

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

В основном это работает так

Android Studio - это просто Android Android Stuff от сообщества IDEA 13 .

. который будет бесплатным, и что угодно из IDEA 13 Ultimate .

. это не требует базы данных или сервера приложений.

Сообщество IDEA 12 не имеет возможности импортировать gradilized проект, и не будет, поэтому, хотя вы можете заняться разработкой для Android сейчас (я так понимаю), не ожидайте, что он будет иметь те же функции, что и Android Studio. В нем много хороших новых вещей для Android, в том числе 13.

Рад был помочь! Я лично люблю ИДЕЮ и ненавижу Eclipse. Это первый раз, когда я начал играть с EAP, потому что мне явно нужна совместимость со всеми, кто переходит на Android Studio. Начиная с AS 0.5.8, это больше не правильно. Вы можете определенно запустить стандартный код Java SE в AS. По крайней мере, мне удалось импортировать проект Swing, разработать и запустить его. К сожалению, вы не можете создать «обычный» Java-проект на момент написания этой статьи, по крайней мере, не так, как я знаю. По состоянию на 0.6.1 вы можете. Смотрите мой ответ ниже. Пожалуйста, удалите / отредактируйте этот ответ, так как он больше не является правильным. Android Studio теперь может создавать модули Java и запускать их в локальной JRE. Так что лучше использовать Android-Studio для Android, а IntelliJ для Java и все остальное? Как насчет поддержки SWT на IntelliJ? Вы знаете хорошего дизайнера интерфейса для этого? Мне это нужно в основном для предварительного просмотра пользовательского интерфейса.

Простой способ запустить Java-программу в Android Studio:

1) Создайте класс Java, скажем, "Test.java" в Android Studio.

2) Напишите свой код, например, Hello World программу для тестирования.

3) Щелкните правой кнопкой мыши по классу Java и выберите параметр «Запустить« Test.main () »» или нажмите Cntrl + Shift + F10.

Там у вас есть ваш Java-код, работающий ниже.

Это сработало - спасибо! В моем случае у меня были проблемы со сбоем сборки gradle, когда я впервые пытался это запустить. Так что я сделал, Android Studio > File > Invalidate Caches / Restart и тогда проблема была решена @Shruti Первая компиляция занимает некоторое время после перехода от запуска приложения к запуску test.java. Знаете ли вы, если создаваемый файл добавляется к размеру APK вообще?

С Android Studio 0.6.1+ (и, возможно, ранее) вы можете легко разрабатывать стандартные приложения Java (не Android).

Этот метод был протестирован на 0.8.2:

Начните с создания приложения Android Phone ванили, используя Файл> Новый проект. Затем добавьте модуль библиотеки Java для хранения кода приложения Java. (Выберите «Библиотека Java», даже если вы создаете приложение). Вы найдете, что можете создавать и запускать приложения Java с помощью main() методов, приложений Swing и т. Д.

Вы захотите удалить автоматически созданный Android-модуль «приложение», который вы не используете. Перейдите в Файл -> Структура проекта и удалите его (выберите модуль «приложение» в поле слева и нажмите значок «минус» над полем). Теперь, когда вы снова откроете Файл -> Структура проекта -> Проект, вы увидите опции для выбора SDK проекта и уровня языка, а также кучу других опций, которые ранее были скрыты. Вы можете удалить модуль «app» с диска.

В 0.6.1 вы могли бы избежать создания модуля Android в первую очередь:

Перейдите в Файл> Новый проект. Заполните ваше имя приложения. На странице выбора «форм-факторы», где вы указываете минимальный Android SDK, снимите флажок «Мобильный» и приступите к созданию проекта.

После создания проекта перейдите в «Файл» -> «Структура проекта» -> «Проект» и установите свой JDK в качестве «Project SDK». Добавьте модуль библиотеки Java для хранения кода приложения, как указано выше.

Где тогда найти сборку? Если я нажму Build-> Make Project или Build-> Compile 'PureJava.java', андроид-студия скажет: «Компиляция завершена успешно». Но я не могу найти какие-либо файлы сборки. Я удалил модуль приложения, а также папку приложения. @ MLProgrammer-CiM да, это возможно. Со мной случилось так, что при отладке IDE в какой-то момент в фазе «обновления индексов» зависает, я не знаю, что его вызывает, я пытался очистить кеш и перезапустить.

Вот как выглядит установка.

введите описание изображения здесь

введите описание изображения здесь

Изменить настройки> '+'> Приложение:

Привет, Адам, могу я узнать, все ли еще работает? И зачем нам нужен gradle для этого приложения? Может ли проект быть дополнительно очищен, чтобы присутствовали только минимальные файлы? Привет @Harsha, я реализовал это в качестве эксперимента в 2016 году. Я не реализовал это в последнее время, так как я использую автономный IntelliJ для серверных приложений Kotlin / Java. Не стесняйтесь обновлять комментарии / пост с вашими обновленными результатами.

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

В Android Studio вы можете щелкнуть правой кнопкой мыши класс с помощью метода main и выбрать «Run .main ()». Это создаст новую конфигурацию Run для YourClass, хотя это не совсем работает: в нем будут отсутствовать некоторые записи пути к классам.

  • Файл -> Структура проекта .
  • Выберите «Модули» на панели «Параметры проекта» на панели левой колонки.
  • Выберите свой модуль в списке модулей на панели средней колонки
  • Выберите вкладку «Зависимости» на панели правой колонки

И затем для модуля, в котором у вас есть Java-приложение, а также для каждой из зависимостей модуля, которые вам нужны: - Нажмите «+» -> «Банки или каталоги» в правом нижнем углу панели правой колонки - Перейдите к выводу в папке модуля (например, my_module / build / classes / main / java) и нажмите «OK» - в новой записи в списке зависимостей в правом углу измените поле выбора с «Compile» на «Runtime»

После этого вы сможете выполнить только что созданную конфигурацию Run для запуска простого Java-приложения.

Следует отметить, что для моей конкретной [довольно сложной] настройки проекта Android Studio мне нужно вручную собрать проект с помощью gradle из-за пределов Android Studio, чтобы заставить мои простые классы Java-приложений быть построенными, прежде чем я запустите приложение - я думаю, это потому, что конфигурация Run типа «Приложение» не запускает соответствующую сборку Gradle.

Наконец, это было сделано на Android Studio 0.4.0.

Я надеюсь, что другие найдут это полезным. Я также надеюсь, что Google скоро поддержит эту функцию.

I have to manually build the project with gradle, from outside Android Studio Как ты это делаешь?

Я попытался открыть свой проект, который я запустил в Android-студии, но он не получился при сборке Gradle. Вместо этого я одновременно открыл android studio и intellij, поместил один экран рядом с другим и просто перетащил свои java-файлы, макеты xml, drawables и манифест в проект нового проекта, начатого в IntelliJ. Это помогло решить проблемы сборки сборки, и теперь я могу начать новый проект в IntelliJ и разработать либо приложение для Android, либо базовое приложение Java. К счастью, это сработало, потому что я терпеть не мог иметь столько IDE на моем компьютере.

Рассмотрим пример создания простейшего класса. Давайте с его помощью смоделируем окружности на координатной плоскости.

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

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

System . out . println ( "Окружность с центром (" + x + ";" + y + ") и радиусом " + r ) ; // масштабируем, выполняем преобразование подобия с коэффициентом k // Создаём объект (окружность класса Circle), у неё будет нулевой // радиус и центр в (0.0;0.0), поскольку все свойства получат o2 . printCircle ( ) ; // Окружность с центром (0.0;0.0) и радиусом 5.2124

Конструкторы

Когда мы создаём объект командой Circle o1 = new Circle(); используется так называемый конструктор по умолчанию (или конструктор без параметров) — это специальный метод класса, мы его не определяли явно, но даже если его не определить он создаётся автоматически, выполняется при создании каждого нового объекта и присваивает первоначальные значения его свойствам (инициализирует их). Значения по умолчанию для свойств зависят от их типа (0 или 0.0 для чиловых типов, false для логического типа и т.д.).

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

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

Что вам нужно

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

Полные инструкции по установке Eclipse (включая поддерживаемые версии) и Android SDK см. На веб-сайте разработчиков Android .

Что такое внутренний класс?

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

Вот пример класса верхнего уровня с двумя внутренними классами:

В этом примере класс User имеет два внутренних класса: LoginInfo и Preferences. Хотя все пользовательские данные и функциональные возможности могут быть определены в классе User, использование внутренних классов для разделения функциональных возможностей может облегчить чтение и обслуживание кода. Внутренние классы LoginInfo и Preferences также имеют доступ к защищенным / закрытым полям и методам, доступным в классе User, которые они иначе не могли бы иметь из-за безопасности, если бы они были определены как самостоятельные классы.

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

Использование статических вложенных классов

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

открытый класс пользователя < // Пользовательские поля, включая переменные типа LoginInfo и UserPreferences // Разные пользовательские методы класс LoginInfo <>открытый статический класс ServerInfo <> < // Информация сервера относится ко всем экземплярам пользователя >>

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

Сила анонимных внутренних классов

Теперь давайте посмотрим на практические примеры анонимных внутренних классов, используемых в Android.

Использование анонимного внутреннего класса для определения слушателя

Разработчики Android часто используют анонимные внутренние классы для определения специализированных слушателей, которые регистрируют обратные вызовы для определенного поведения, когда происходит событие. Например, чтобы прослушивать щелчки в элементе управления View, разработчик должен вызвать метод setOnClickListener (), который принимает один параметр: объект View.OnClickListener.
Разработчики обычно используют метод анонимного внутреннего класса для создания, определения и использования своего пользовательского View.OnClickListener следующим образом:

Использование анонимного внутреннего класса для запуска потока

Давайте посмотрим на другой пример. Довольно часто определяют новый класс Thread, предоставляют реализацию его метода run () и запускают этот поток, все за один раз:

Использование именованного внутреннего класса

Использование анонимных внутренних классов для слушателей в Android настолько распространено, что это практически вторая натура. Тогда почему бы вам не использовать их? Давайте ответим на это гипотетическим примером.
Допустим, у вас есть экран с 100 кнопками (мы говорили гипотетически, верно?). Теперь, скажем, каждая кнопка при нажатии делает одно и то же . В этом случае мы будем просто слушать клики и вставлять текст из переданного объекта View (текст, отображаемый на кнопке, на которой была нажата кнопка):
Вот псевдокод для этого:

Короткий и элегантный, так что с ним не так? На каждой итерации создается новый объект OnClickListener. Поскольку все они одинаковы, нет веских причин для создания 100 из них. Вместо этого вы можете создать один именованный внутренний класс, один раз создать его экземпляр, а затем передать его в метод setOnClickListener (). Например:

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

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

Записка о нюансах

Это руководство предназначено для ознакомления с внутренними классами в Java. Есть стилевые соображения и нюансы при использовании внутренних классов разными и креативными способами. Более того, вы можете узнать больше о внутренних эффектах и ​​предельных различиях в производительности, которые могут проявляться при использовании вложенных классов различными способами. Однако все это выходит за рамки данного руководства.

Краткое примечание по терминологии

Хотя мы пытались соответствовать терминологии для вложенных и внутренних классов, эта терминология не всегда согласуется с различными сетевыми и автономными ресурсами. Ниже приведен список терминов из текущей документации Sun / Oracle, который так же хорош, как любой из них для авторитетности на Java:

  • Вложенный класс : класс, определенный внутри другого класса
  • Статический вложенный класс : статический класс, определенный внутри другого класса
  • Внутренний класс : нестатический вложенный класс, определенный внутри другого класса
  • Локальный внутренний класс : класс, определенный в методе
  • Anonymous Inner Class : безымянный класс, определенный в методе

Смущенный? Вы можете использовать методы java.lang.Class, называемые isLocalClass () и isAnonymous (), в экземплярах классов для определения пары этих свойств. Запись в блоге Oracle также пытается немного прояснить ситуацию с помощью хорошей диаграммы Венна.

Завершение

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

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

За основу статьи взяты советы из классики “Роберт К. Мартин: Чистый код”. Отобрал из них те, которые наиболее часто встречались в виде проблем у студентов. Приведенные советы написаны с учетом моего опыта разработки коммерческих Android приложений. Поэтому не ко всем Android-проектам приведенные ниже советы подойдут, я уже не говорю про другие системы.

Советы в основном приводил с примерами кода как НЕ НУЖНО делать. Как ни странно, у большинства студентов были одни и те же ошибки. Все примеры кода были придуманы, любые совпадения с реально существующим кодом случайны.

Общие советы

1. Код должен быть легко читаемым, понятным и очевидным

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

2. При написании кода нужно придерживаться Java Code Conventions либо других спецификаций, принятых на проекте командой

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

Наименование

1. Имена классов, функций, переменных и параметров должны передавать закладываемый в них смысл.

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

Наименования классов MyActivity, CustomView, MyAdapter говорит только об одном, что это не часть Android SDK и все. SecondActivity говорит, что это не часть Android SDK и о наличии в проекте еще одного Activity, но не факт =)

Правильно именовать классы: MainActivity, FoodsActivity, FoodCartActivity, PhoneInputView . MainActivity — очевидно, что основной разводящий экран приложения. FoodsActivity — экран с перечнем продуктов. PhoneInputView — компонент ввода номера телефона.

Следующие названия переменных бесполезны и нарушают правила наименования:

как и параметры конструктора:

2. Название публичного класса и файла должно совпадать.

Есть следующий класс

Название файла при этом оказывается “products_Activity.java”.
Это не правильно. Название публичного класса и java-файла должны совпадать.

3. В наименованиях нужно использовать только буквы латинского алфавита, никаких цифр, символов подчеркивания и дефисов. Исключения составляют наименования из стандартов (ГОСТ, ISO), символы подчеркивания для разделения слов в наименованиях констант.

Примеры выше: m_textview_1 . Часто вместо lastName пишут userName2 , что не правильно.

4. Не нужно использовать строчные “L” и “O” в качестве имен локальных переменных, т.к. их трудно отличить от “1” и “0”.

Надуманный пример, но что-то подобное я встречал в своей практике

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

5. Не нужно указывать тип в суффиксе имен.

Вместо accountList нужно писать просто accounts . Это позволит в любое время изменить тип переменной без переименования самой переменной.
А еще ужаснее выглядит nameString, ageFloat .

Исключение составляют наследники классов Android SDK: Activity, Fragment, View, Uri и т.д. По названию NewsSynsService сразу понятно, что класс является "сервисом" и ответственен за синхронизацию новостей. Использование суффикса view в nameView, photoView позволяет легко отличить переменные, относящиеся к верстки, от остальных. Имена view обычно начинают с существительного. Но имена кнопок лучше начинать с глагола: buyButton

6. Имена могут и должны содержать термины из математики, названия алгоритмов, паттернов проектирования и т.д.

Увидев имя BitmapFactory , не автор кода сразу поймет смысл этого класса.

7. Не нужно указывать никакие префиксы при именовании.

Вместо m_user, mUser просто пишется user . Указывать префикс s для статических полей в современных IDE излишне.

Исходники Android SDK не являются здесь показателем в силу давности создания первых версий и наследования кодовой базы до наших дней.

s_ ни к чему в начале названия статического поля. К тому же название констант должно писаться прописными буквами:

8. В наименование классов нужно использовать существительные.

Классы это как объекты реального мира. Поэтому нужно использовать существительные для их названия: AccountsFragment, User, Car, CarModel .

Не нужно называть классы Manager, Processor, Data, Info , т.к. они имеют слишком общее значение. Лучше название класса длиной в два-четыре слова, чем просто Data .

9. Названия классов должны начинаться с прописной буквы.

Слова НЕ должны отделяться символом подчеркивания. Нужно следовать нотации CamelCase: GoodsFragment, BaseFragment

10. Используйте одно слово для каждой концепции.

Использование fetch, retrieve, get в одном классе сбивает с толку. Если класс назвали Customer , то имена переменных класса и параметров функций этого типа лучше называть customer , а не user .

Функции

1. Функция должна выполнять только одну “операцию”. Она должна выполнять ее хорошо. И ничего другого она делать не должна.

Под “операцией” следует понимать не одну математическую операцию или вызов другой функции, а действия на одном уровне абстракции. Чтобы определить, что функция выполняет более одной операции, следует попробовать извлечь из нее другую функцию. Если извлечение функции не дает ничего кроме простой перестановки кода, то значит разбивать дальше функцию не имеет смысла

К примеру есть функция setProducts класса ProductsAdapter :

Внутри функции происходит три основных операции: 1) фильтрация newProducts , 2) очистка и вставка новых значений в products , 3) обновление адаптера notifyDataSetChanged .

Фильтрация элементов newProducts должна происходить в другом методе и даже в другом в класса (например в presenter-е). В ProductsAdapter должны прийти уже отфильтрованные данные.

Лучше переделать код следующим образом:

Параметр newProducts содержит уже отфильтрованный список продуктов.
Можно еще строчки java products.clear(); products.addAll(newProducts);
вынести в отдельную функцию, но особого смысла я в этом не вижу. Лучше заменить notifyDataSetChanged на DiffUtil, это позволит обновлять ячейки в списке эффективнее

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

3. В теле функции все должно быть на одном уровне абстракции.

Вычисление значения локальной переменной errorMessage имеет более низкий уровень абстракции, чем остальной код внутри функции. Поэтому код java "Article " + article.getName() + " is incorrect" лучше вынести в отдельную функцию.

4. Наименовании функции и передаваемых параметров должно сообщать о том, что делает функция

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

Непонятно по какому полю будет происходить поиск, что передается на вход функции.

Лучше переделать в следующий вид:

Название функции говорит, что происходит поиск Product по полю id . На вход функция принимает не “null” значение. Если Product не найдется, то вернется “null”.

Роберт К. Мартин советует использовать параметры в качестве части названия функции:

Вызов функции может выглядеть так:

На проектах я такой способ не встречал. Лучше данный способ не использовать и писать полностью название:

5. Имена функций должны начинаться с глагола. Лучше длинное имя, чем не содержательное короткое.

Название start не сообщает, что именно стартует функция. Только заглянув в тело становится понятно, что функция открывает Activity.

А должно быть понятно предназначение функции уже по названию.

6. Вместо передачи в аргументы функции флага (boolean) лучше разбить функцию на две функции

Часто этот флаг является причиной увеличение размера функции при ветвлении логики выполнения в зависимости от значения флага. В таких случаях следует подумать о разбиении данной функции на две. Разное поведение функции в зависимости от переданного флага не всегда очевидно.

7. Дублирующий код следует выносить в отдельную функцию.

Код внутри setOnClickListener отличается только стилем. Этот код стоит вынести в отдельный метод:

8. Не передавайте и не возвращайте из функции “null” когда можно вернуть пустой объект.

Это позволит избежать ошибок NullPointerexception и не нужно будет в местах вызова писать проверки на null.

Kotlin поможет отучиться от вредной привычки передавать и возвращать null.)

Форматирование

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

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

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

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

3. Каждая последовательная группа строк кода должна представлять одну законченную мысль. Мысли отделяются друг от друга в коде с помощью пустых строк, только слишком злоупотреблять пустыми строчками не стоит

Связанная группа строк это как абзацы в статье. Для разделения абзацев используется красная строка или пустая строка. Так и в коде следует разделять разные по смыслу группы строк, используя пустые строки.

4. Переменные экземпляра класса, статические константы должны быть все в начале класса в одном месте.

В начале класса объявляются публичные константы, затем приватные константы и после них идут приватные переменные.

5. Используйте пробелы для повышения читаемости кода

  • в математических операциях для отделения символа операции от операндов: int x = a + b;
  • отделения параметров функций: private Article createNewArticle(String title, String description)
  • передаваемых параметров функции: createNewArticle(title, description)

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

Лишь прочитав постановку задачи я понял, для чего в коде использовалось число “10”. Лучше это число вынести в константу и дать осмысленное имя.

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

Классы

1. Класс должен иметь одну “ответственность”, одну причину для изменения.

К примеру, наследники класса RecyclerView.Adapter должны отвечать за создание и связывание View с данным. В нем не должен находится код сортировки/фильтрации списка элементов.
Часто в файл с Activity добавляют класс RecyclerView.Adapter, что является не правильным.

2. Не нужны пустые методы или просто вызывающий метод из родительского класса

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

Загляните в исходники родительских классов, документации. Переопределяемые методы жизненного цикла Activity, Fragment, View должны обязательно должны вызывать методы родительского класса.

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

Советы о разном

1. Используйте средства Android Studio для улучшение качества Вашего кода.

Если она подчеркивает или выделяет код, значит что-то может быть не так. В Android Studio есть средства Rearrange, Reformat, Extract Method, Inline Method, анализаторы кода, горячие клавиши и т.д.

2. Не нужно комментировать каждый метод, код должен быть самодокументированным.

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

3. Строки, цвета, размеры должны быть в ресурсах (xml)

Не нужно писать:

Исключения составляют файлы из папок test, mock. Такие файлы не должны попадать в релизную версию

4. Не нужно передавать context в RecyclerView.Adapter. context можно получить из любой view. Элемент по клику в RecyclerView.Adapter должен меняться через notifyItemChanged, а не непосредственным изменением вьюшек в методе обработки нажатия

В методе onClick непосредственно происходит вызов bindViewHolder , что НЕ правильно.

5. В RecyclerView.ViewHolder вместо определения позиции объекта в списке нужно вызывать getAdapterPosition, а не передавать position из метода onBindViewHolder

Правильно писать:

Либо можно вместо позиции передавать ссылку на исходный объект с данными

6. Используйте Quantity Strings (Plurals) для множественного числа. Вместо написания в коде логики по подбору правильного окончания слов.

7. Не сохраняйте большие данные Bitmap в bundle. Размер bundle ограничен

8. Если прописать “id” в xml, то Android сам восстановит состояние стандартных View при повороте.

Читайте также: