Избегайте дублирования новых классов с тем же кодом - PullRequest
0 голосов
/ 04 марта 2020

У меня есть класс, который создает проблему на доске Jira. Я хочу использовать его в 5 различных сценариях ios, но единственное, что будет отличаться, - это обязательные поля, такие как summary, description и issuetype. Как справиться с таким сценарием, чтобы избежать создания нескольких классов с 90% одинаковым содержимым?

Это основное содержимое класса:

module Jira
  class TicketCreator
    def call
      issue = client.Issue.build
      issue.save(required_fields)
    end

    private

    def client
      @client ||= Jira::JiraConnection.new.call
    end

    def required_fields
       #data from below examples
    end
  end
end

Вот сценарий ios для обязательных поля, которые я хочу использовать, зависят от информации о webhook:

def required_fields
  {
    'fields' => {
      'summary' => 'Create new repo <github_repo> for <Github user>',
      'description' => 'This is an automatic confirmation of creating new PRIVATE repo
                      - <github_repo> for <Github user>',
      'project' => { 'key' => 'TEST' },
      'issuetype' => { 'id' => '12580' },
      'customfield_15100' => 'None'
    }
  }
end

def required_fields
  {
    'fields' => {
      'summary' => 'Add <Github user> collaborator to <github_repo>',
      'description' => 'This is an automatic ticket confirmation of user added',
      'project' => { 'key' => 'TEST' },
      'issuetype' => { 'id' => '12580' }, # nonautoresolved
      'customfield_15100' => 'None'
    }
  }
end

def required_fields
  {
    'fields' => {
      'summary' => 'Recheck <Github user> deleted <github_repo>',
      'description' => 'This is an automatic ticket confirmation of delete repo <github_repo>',
      'project' => { 'key' => 'TEST' }, # change to project_key
      'issuetype' => { 'id' => '12579' }, # autoresolved
      'customfield_15100' => 'None'
    }
  }
end

Как избежать создания новых классов, где единственным отличием будет этот required_fields метод?

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Можете ли вы отправить обязательные поля вашему классу?

# TicketCreator.new(required_fields).call
module Jira
  class TicketCreator
    def initialize(required_fields)
      @required_fields = required_fields
    end

    def call
      issue = client.Issue.build
      issue.save(@required_fields)
    end

    private

    def client
      @client ||= Jira::JiraConnection.new.call
    end
  end
end

Если вам нужна команда для каждого, вы можете использовать наследование:

module Jira
  class Base
    def call
      issue = client.Issue.build
      issue.save(required_fields)
    end

    private

    def client
      @client ||= Jira::JiraConnection.new.call
    end

    def required_fields; end
  end
end

module Jira
  class CreateRepo < Base
    def required_fields
      {
        'fields' => {
          'summary' => 'Create new repo <github_repo> for <Github user>',
          'description' => 'This is an automatic confirmation of creating new PRIVATE repo
                      - <github_repo> for <Github user>',
          'project' => { 'key' => 'TEST' },
          'issuetype' => { 'id' => '12580' },
          'customfield_15100' => 'None'
        }
      }
    end
  end
end

module Jira
  class AddCollaborator < Base
    def required_fields
     {
      # data
     }
    end
  end
end
0 голосов
/ 04 марта 2020

Вы можете просто использовать аргументы ключевых слов вместе с Hash # reverse_merge , чтобы объединить параметры по умолчанию с переданными параметрами:

module Jira
   class TicketCreator
     # Do setup at initializion instead
     def initialize
       # FIXME - style violation - this should be client.issue.build 
       @issue = client.Issue.build 
     end

     def call(**options)
       @issue.save(required_fields(options))
     end

     # Takes care of initializion so that you can call 
     # Jira::TicketCreator.call - you can DRY this though inheritance or mixins
     def self.call(**options)
       new.call(options)
     end

     private

     def client 
       @client ||= Jira::JiraConnection.new.call
     end

     def required_fields(**options)
       {
         'fields' => {
           'summary' => 'Recheck <Github user> deleted <github_repo>',
           'description' => 'This is an automatic ticket confirmation of delete repo <github_repo>',
           'project' => { 'key' => 'SUP' }, # change to project_key
           'issuetype' => { 'id' => '12579' }, # autoresolved
           'customfield_15100' => 'None'
         }.reverse_merge(options.deep_stringify_keys)
       }
     end
   end
 end

 ticket = Jira::TicketCreator.call(
    project: { key: 'TEST' },
    issuetype: { id: '12580' }
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...