2009-09-29 5 views
1

У меня есть функция readData(), которая считывает файлы a, возвращает несколько разных объектов анализируемых данных. Прямо сейчас, возвращаемый тип readData() является Object[]:Java: Использование одной функции для возврата нескольких различных типов значений

Object[] data = readData(); 
MyGenome genome = data[0]; 
Species[] breeds = data[1]; 
//etc 

Это чувствует себя неловко. Есть ли лучший способ вернуть эти данные? Я не хочу иметь отдельные функции, такие как readGenome() и readSpecies(), потому что это потребует повторного итерации файлов в два раза. Кроме того, я бы предпочел бы завершить все сбор данных в одной функции.

Аналогичная проблема: функция, которая возвращает матч не менее четырех символов между двумя строками:

public int[][] findMatch(String g0, String g1) { /* cool stuff */ } 
//... 
int[][] bounds = findMatch("ACOIICOCOCICOICA", "AOCCCCCCICCIIIIIOIAOCICOICOICA"); 

где bounds[0][0] есть левая граница g0, bounds[0][1] является правильным ограничение на g0, bounds[1][0] является левая граница на g1 и т. д. Это также кажется неудобным. Трудно закодировать результат без постоянного поиска ключей.

+0

Является ли порядок объектов в вашем файле одинаковым? Как один геном, затем 5 видов? Или это от чего-то зависит? Откуда вы знаете, что данные [0] - это MyGenome, а данные [1] - виды –

ответ

5

Как насчет использования строго типизированного класса для представления сложного возвращаемого типа readData()?

public class Taxonomy 
{ 
    public MyGenome genome; 
    public Species[] breeds; 
    //etc 
{ 

Taxonomy data = readData(); 

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

public class SearchBoundary 
{ 
    public int left; 
    public int right; 
} 

SearchBoundary resultBounds = findMatch(searchBounds); 
+1

НИКОГДА (и да, я имею в виду ____NEVER____), публичные без окончательного. И даже для этого простого класса вы должны сделать переменные частными. Также НИКОГДА не делайте изменчивую вещь (например, массив и, возможно, MyGenome). – TofuBeer

+0

Хе-хе - пусть это будет урок: обратите внимание, как я не указывал публичный * или * частный и не получал пламя ... Люди просто предположили, что он был неполным (что должно было быть) – Stephen

+2

НИКОГДА (да, я имею в виду __NEVER__) строго следуют правилам о том, что вы НИКОГДА НЕ должны делать. Существует несколько правил, которые не имеют исключений.Например, передача чистых данных обратно и вперед, внутри, между двумя местами, полностью контролируемыми вашим кодом ... Избежание глупости геттеров и сеттеров в такой ситуации вполне разумно. – RHSeeger

6

Создайте новый класс:

class MyAnalysedGenome { 
    MyGenome genome; 
    Species[] species 
    ... 
} 

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

0

Для первого вопроса, не могли бы вы просто использовать промежуточное представление данных? Я имею в виду, что вы могли бы прочитать свой файл один раз, что даст вам содержимое файла (которое вы можете отформатировать так, как вы хотите), а затем создайте два метода: readGenome() и readSpecies(), которые будут использовать этот файл в качестве параметра.

0

Вы можете создать класс с геномом и видами в качестве полей.

... 
class DataToBeRead { 
    MyGenome genome; 
    Species[] breeds; 
} 
... 


DataToBeRead data = readData(); 
MyGenome  genome = data.genome; 
Species[] breeds = data.breeds; 

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

Вы также можете сделать его статическим, если вы не хотите создавать для него отдельный файл.

Надеюсь, это поможет.

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