2015-11-06 3 views
1

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

В настоящее время у меня есть все мои данные, параметры и состояния, хранящиеся в большом «DataObject». Это выглядит примерно так:

public class DataObject { 
    public static final String M_READY_INTENT = "com.intent.action.M_READY" 
    //and more... 
    public static jsonRawFoos; 
    public static jsonRawBars; 
    //and more.. 
    private static HashMap<String, Foo> catFoos = new HashMap<>(); 
    private static HashMap<String, Bar> catBars = new HashMap<>(); 
    //and more.. 
    private static String session; 
    //and more.. 
    private static boolean optFoo; 
    //and more.. 
    public static boolean dataState = false; 
    //and more.. 

    /* Static accessors, static data processors */ 
} 

Эта сумма может составлять до 42 полей. Они должны быть доступны в разных действиях и классах в моем приложении. Я рассмотрел просто создание локального экземпляра в моем MainActivity и просто сопряжение MainActivity, чтобы получить доступ к DataObject, но я не уверен, что передача интерфейса повсюду является правильным вариантом.

Чтобы подвести итог моему вопросу, каков наилучший подход к инкапсуляции/организации моих данных, чтобы сделать его доступным в нескольких разных объектах, сохраняя мой код чистым, эффективным с точки зрения памяти и безопасным от сбоев во время паузы/возобновления/приостановки Мероприятия?

Edit:

Чтобы добавить больше деталей, мое приложение делает запросы API, чтобы получить списки 3-х различных видов объектов, мы будем называть их Foo, Bar и Cat. Результат этих вызовов в формате JSON, поэтому после того, как IntentService вернется с результатами вызова API, DataObject анализирует JSON и сохраняет сгенерированные объекты в HashMap s.

Сгенерированные объекты списков должны быть доступны адаптерами в Fragments, содержащемся в MainActivity. Существуют и другие виды деятельности, которые иногда нуждаются в доступе к этим спискам объектов.

Кроме того, пользователь может установить определенные параметры, которые влияют на один или многие из Fragment s и Activity s на приложение. Я также установил эти настройки в DataObject.

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

Второе редактирование:

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

+0

Можете ли вы быть более конкретными в отношении ваших данных? Я думаю, что это правильный вопрос, но без каких-либо подробностей я думаю, что трудно найти решение. В таких ситуациях я обычно задаю вопросы о том, что имеет смысл группировать вместе, как все относится друг к другу, кому нужно использовать эти объекты и т. Д. Не зная конкретно, для чего должен отвечать «DataObject», Я думаю, что у вас могут возникнуть некоторые неопределенные ответы. Сразу после битвы это выглядит как анти-шаблон объекта Бога, но мне нужен какой-то контекст. –

+0

Ну, я думаю, это на самом деле моя проблема.DataObject не несет ответственности за определенную вещь, он просто держит, организует и работает с данными в моем приложении. Я попытаюсь добавить больше деталей, не сделав свой пост гигантским раздутым беспорядком. – nukeforum

+1

Я тебя слышу. Определенно звучит так, будто у вас может быть ситуация с объектами богов - один объект, который слишком много знает: https://en.wikipedia.org/wiki/God_object –

ответ

1

Cohesion и Coupling - 2 важная концепция, чтобы сделать хороший дизайн OO, который вы пытаетесь.

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

Основные вопросы, которые вы должны спросить себя, как (, так как вы не предоставили все данные, так что вы должны думать и задавать себе):

  • Являются ли эти поля, связанные друг с другом
  • Возможно, эти поля определяют состояние объекта.

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

Ознакомившись с тем же кодом, который вы предоставили, вы сделали все, что статично, а поля не похожи на определение состояния объекта или класса, поэтому, возможно, сохранение их в одном классе выглядит хорошо, но одна вещь, которую вы можете сделать, - это разделение данные в 2 классах, сделайте еще один класс, например ApplicationConstants, и поместите все константы, такие как static final String M_READY_INTENT = "com.intent.action.M_READY" в этом классе.

Я рассмотрел только создать локальный экземпляр в моем MainActivity и просто взаимодействующее MainActivity, чтобы получить доступ к DataObject, но я не уверен, что передача интерфейса везде правильный вариант.

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


обновляется на основе редактирования параметров порядка.

Отказ от ответственности: Я не все ваши поля класса DataObject и их цели, поэтому ниже дизайн на основе информации, предоставленной

Похоже, вам нужно иметь 3 различных классов, чтобы поддерживать состояние, что вы называете Foo, Bar и Cat.

Таким образом, сохранить этот DataObject класс в качестве суперкласса и иметь поля в ней, которые не требуют уникального состояния, так:

public class DataObject { 
    public static final String M_READY_INTENT = "com.intent.action.M_READY" 
    // Code for informing the rest of the application when certain data has become available. Could be static ... 
    //Anything else which is not unique and is not dependent on Foo, Cat or Bar... 
} 

Затем создать 3 новых классов, которые будут содержать состояние, образец FooDataObject

public class FooDataObject extends DataObject { 
    public jsonRawFoo; 
     public HashMap<String, Foo> catFoos = new HashMap<>(); 
     public String session; 
     public boolean optFoo; 
     public boolean dataState = false; 
     //Etc... more methods and getter/setter ... 
} 


public class BarDataObject extends DataObject { 
    public jsonRawBar; 
     public HashMap<String, Foo> catBars = new HashMap<>(); 
     public String session; 
     public boolean optBar; 
     public boolean dataState = false; 
     //Etc... more methods and getter/setter ... 
} 

Таким образом, в основном все, что глобальное состояние будет в конечном итоге, как поле в DataObject, и все что конкретное состояние будет в конечном итоге, как поле в FooDataObject или CatDataObject или BarDataObject.

+0

Хорошие комментарии. Возможно, преимущество в том, что ссылка на объект в основном классе активности (или классе Application) может быть проще реорганизовать или переделать позже. – nasch

+0

Я имел в виду линию, чтобы передать, что я рассматриваю возможность сделать все ** не ** статическим, создав локальный экземпляр в моей MainActivity для доступа через интерфейс. Извините за путаницу. Я полагал, что таким образом, «DataObject» будет более безопасным с точки зрения меняющегося состояния приложения. – nukeforum

+0

Я размышлял над «Связаны ли эти поля друг с другом?» вопрос на некоторое время. Это сложно, так как объекты «Бар» и «Кошка» представляют собой просто организационные представления коллекций «Foo's». Они чувствуют, что все они связаны друг с другом. Возможно, требуется больше поиска душ. – nukeforum

Смежные вопросы