Skip to content

Conversation

@DmKazakov
Copy link
Collaborator

No description provided.


// TODO handle this exceptions sensibly!
try {
Controller.createDatabases(this);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Ваше приложение не будет работать, если оно в какой то момент будет сериализовано и убито андроидом из за недостатка ресурсов и потом восстановлено (но не в мейн активити). Тогда коннекшен к базе не будет запрашиваться вообще.

Второй момент - создание активити из стороннего приложения. Допустим гугл решит интегрироваться с вашим приложением и сделает кнопку добавления домашек из почты. В коде это будет выглядеть как startIntention("AddHomeworkActivity", {"Subject" -> "Maths, "Deadline" -> "10.10.2010", ... }). Тут опять получиться путь, который минует MainActivity вообще.

Это только андроид специфичные случаи. Помимо этого способов выстрелить себе в ногу через глобальные константы миллион.
В целом рекомендация такая - удалить все статические поля, кроме final констант.


outputCurrentDate();
outputDeadlines();
outputTodaySchedule();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вообще хорошо, что вы выделили отдельные шаги в методы, но тут это вольно сильно путает. Например:

db = initDb()
deadlines = db.readDeadlines()
console.print(deadline)

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

try {
Controller.createDatabases(this);
} catch(Exception exception) {

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Бог с ней с обработкой ошибок. Но даже в процессе разработки - просто залогируйте ошибку. Сильно упростит дебаг.

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Вам вообще не нужно делать startActivityForResult. Вы результат не используете.

outputDeadlines();
outputTodaySchedule();

Явно должны переехать в onResume.

public class AddHomeworkActivity extends AppCompatActivity {

private static final String TAG = "AddHomeworkActivity";
public static final HomeworkFieldsAccumulator HFA = new HomeworkFieldsAccumulator();
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Статический класс в статическое поле.

private int day;
private int hour;
private int minutes;
private double expectedScore = Double.MIN_VALUE;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

year, month и day - должны быть представлены одной структурой данный, они выставляются за раз.
hour, minutes - та же история.
При передаче дальше можно сгрупировать и их во что то вроде DateTime

if (howToSend == null) {
howToSend = " ";
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Инкапсулировать сюда базу данных точно очень плохая идея.
Получается методы set* - читают поля и пишут в структурку, а add - пишет в базу данных. Это невозможно предугадать по названию

subject, regularity, description,
howToSend, expectedScore, files);
}

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Те же самые проблемы. Непонятно какие данные и откуда берутся, куда пишутся. Распилить на два. get и write. Может даже три (что то вроде updateMissing). Совершенно непонятно, почему на isSet проверяются только дата и время? А что остальные?

return subject.trim().length() > 0;
}

public void clear() {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

После рефакторинга выше этот метод уходит совсем.


public void editHomework( int id ) {
if (description == null) {
description = " ";
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это какое то спорное решение - присваивать пробел. Null - понятно, пустая строка в целом тоже. Они обычно участвуют в проверках вида isNullOrEmpty. Почему пробел? Это как с цифрами. Присвоение 0 и 1 обычно не вызывает вопросов. А вот, скажем, 3 - подозрительно.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants