заполнение массива разного размера - PullRequest
0 голосов
/ 27 июня 2011

хорошо, я уверен, что это не чистая реализация.

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

Я сделал это довольно грязно, и он вернулся, чтобы укусить меня за задницу!

мы начнем:

У меня есть AccountsGRP[]. Я занимаюсь между этими двумя методами:

    public static AccountGrp[] popAccArr(IncomingObject incObject) {
    ArrayList<AccountGrp> accAL = new ArrayList<AccountGrp>();
    for (int i = 0; i < NoAccounts; i++) {
        accAL.add(popAccAttr(i, incObject));
    }
    AccountGrp[] AccountGrpArr = (AccountGrp[]) accAL
            .toArray(new AccountGrp[accAL.size()]);
    return AccountGrpArr;
}

private static AccountGrp popAccAttr(int i, IncomingObject incObject) {
    AccountGrp acc = new AccountGrpImpl();
    switch (i) {
    case 0:
        acc.setAccount(incObject.getM_clientAcronym());
        acc.setAccountType(AccountType.CUST);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setGrandParentAccount(incObject.getM_grandparentNum());
        return acc;
    case 1:
        acc.setAccount(incObject.getM_brokerAcronym());
        acc.setAccountType(AccountType.BKR);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        // acc.setGrandParentAccount(incObject.getM_grandparentNum());
        return acc;
    case 2:
        acc.setAccount(incObject.getM_errorAccount());
        acc.setAccountType(AccountType.FIRM);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setAccountSubType(AccountSubType.ERROR);
        return acc;
    default:
        acc.setAccount(incObject.getM_clientAcronym());
        acc.setAccountType(AccountType.CUST);
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setGrandParentAccount(incObject.getM_grandparentNum());
        return acc;
    }
}

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

acc.setAccountType(AccountType.BKR);
        acc.setAcctIDSource(AcctIDSource.SLANG);

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

Ответы [ 4 ]

1 голос
/ 27 июня 2011

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

public static AccountGrp[] popAccArr(IncomingObject incObject) {
    AccountGrp[] ret = new AccountGrp[NoAccounts];

    if(ret.length > 0) {
        ret[0] = //first one
    }

    if(ret.length > 1) {
        ret[1] = //second one
    }

    if(ret.length > 2) {
        ret[2] = //third one
    }

    for(int i = 3; i < ret.length; i++) {
        ret[i] = //nth one
    }

    return ret;
}
0 голосов
/ 27 июня 2011

Ваш ОО-дизайн плохой: у вас не должно быть AccountGrp[], вместо этого он должен быть классом с красиво названными атрибутами. Ваш код был бы намного более читабельным и обслуживаемым.

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

public static AccountGrp[] popAccArr(IncomingObject incObject) {
  AccountGrp[] accountGrp = new AccountGrp[noAccounts];
  accountGrp[0] = popAccClient(incObject);
  accountGrp[1] = popAccBroker(incObject);
  accountGrp[2] = popAccError(incObject);
  return AccountGrpArr;
}
0 голосов
/ 27 июня 2011
0 голосов
/ 27 июня 2011

Речь идет не о массивах, а о том, как сопоставить целое число (i = [0-2]) с набором различных параметров, включая значения перечисления, с, возможно, различными типами параметров для каждого (подтип, ссылка на прародителя).

Перегрузка popAccAttr не поможет, так как вызывающий должен будет выбрать правильную перегрузку.Это только перемещает проблему к абоненту.Вы все еще должны отобразить i => params.

На мой взгляд, лучший способ очистить его - удалить непрозрачное целое число i.Что означает «2» за пределами этого метода?Вы можете использовать перечисление, которое предоставляет как список всех возможных типов учетных записей, так и сопоставление для каждого.Похоже, сам тип учетной записи достаточно.Итак, (также удаляя избыточность между «0» и «по умолчанию»),

public static AccountGrp[] popAccArr(IncomingObject incObject) {
    ArrayList<AccountGrp> accAL = new ArrayList<AccountGrp>();
    for (AccountType type : AccountType.values()) { // enumerate values
        accAL.add(popAccAttr(type, incObject));
    }
    AccountGrp[] AccountGrpArr = (AccountGrp[]) accAL
            .toArray(new AccountGrp[accAL.size()]);
    return AccountGrpArr;
}

private static AccountGrp popAccAttr(AccountType type, IncomingObject incObject) {
    AccountGrp acc = new AccountGrpImpl();

    acc.setAccountType(type); // common for all

    switch (type) {
    case CUST:
        acc.setAccount(incObject.getM_clientAcronym());
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setGrandParentAccount(incObject.getM_grandparentNum());
        break;
    case BKR:
        acc.setAccount(incObject.getM_brokerAcronym());
        acc.setAcctIDSource(AcctIDSource.SLANG);
        // acc.setGrandParentAccount(incObject.getM_grandparentNum());
        break;
    case FIRM:
        acc.setAccount(incObject.getM_errorAccount());
        acc.setAcctIDSource(AcctIDSource.SLANG);
        acc.setAccountSubType(AccountSubType.ERROR);
        break;
    default: throw new IllegalArgumentException("unsupported account type: "+type);
    }

    return accc; // common for all
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...