@lookingfor2

Как правильно описать интерфейсом структуры?

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

var errIssueConvert = errors.New("cannot convert issue to needed type")

type ProviderType int
const (
	BANK_A_PROVIDER issue.ProviderType = iota
	BANK_B_PROVIDER
)

type issueUC struct {
	cfg        *config.Config
	logger     iLogger.ApiLogger
	repository iIssue.BankARepository
}

func (u *issueUC) RunIssues(issues []any, p issue.ProviderType) error {
	switch p {
	case BANK_A_PROVIDER:
		var bankAIssues []*models.BankAIssue
		for _, iss := range issues {
			toBankAIssue, ok := iss.(*models.BankAIssue)

			if !ok {
				return errIssueConvert
			}
			bankAIssues = append(bankAIssues, toBankAIssue)
		}
		provider := bankAUC.NewBankAProvider(u.cfg, u.logger, u.repository)
		err := provider.Run(bankAIssues)
		if err != nil {
			return err
		}
		break
    case BANK_A_PROVIDER:
        // some logic
        break
	}
	return nil
}


У разных банков, будут разные параметры метода Run, получается, я не могу описать структуры интерфейсом,
например:
type iProvider interface {
    Run(// разные)
}

func (u *issueUC) RunIssues(issues []any, p issue.ProviderType) error {
    var provider iProvider
	switch p {
	case BANK_A_PROVIDER:
		provider = bankAUC.NewBankAProvider(u.cfg, u.logger, u.repository)
		break
    case BANK_A_PROVIDER:
        // some logic
        break
	}
	provider.Run(issues)
	return nil
}


Первый вариант метода RunIssues мне не нравится по причинам:
- метод большой, при добавлении провайдеров будет разростаться
- выполняет много операций
- нарушает принцип открытости/закрытости, будет постоянно расширяться при добавлении новых банков и тд

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

Как было бы более правильно сделать, подскажите пожалуйста.
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@12rbah
может правильнее было бы сделать абстр фабрику
Это и так не самый частый паттерн для применения, а в го тем более. Если хотите через интерфейсы делать, то фабрики хватит. Вообще хз зачем тут так извращаться, по факту в го проще разделить реализацию по пакетам и создавать нужный объект через NewProvider и затем уже делать с конкретной структурой всё что нужно.
У разных банков, будут разные параметры метода Run, получается, я не могу описать структуры интерфейсом
Напишите что вы хотите сделать, по ощущениям вы сову на глобус натягиваете.
Есть структура с методом, который принимает на вход массив платежей и некий ключ, который определяет какой банк использовать.
Если это то ссылки то фабрики тут хватит, вообще если вы не понимаете зачем вам нужны паттерны, то лучше не использовать их
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы