简体   繁体   English

Metrics/AbcSize:fill_arrays 的分配分支条件大小太高。 [<9, 21, 0> 22.85/17]

[英]Metrics/AbcSize: Assignment Branch Condition size for fill_arrays is too high. [<9, 21, 0> 22.85/17]

I need to generate random data with ffaker and have no clue how to fix abcsize here我需要用 ffaker 生成随机数据并且不知道如何在这里修复 abcsize

Here is what i had这是我所拥有的

class Library
  attr_accessor :authors, :books, :orders, :readers

  def initialize(authors = [], books = [], orders = [], readers = [])
    @books = books
    @orders = orders
    @readers = readers
    @authors = authors
  end

  def create_data
    @authors = []
    @books = []
    @readers = []
    @orders = []

    100.times do
      authorname = FFaker::Book.author
      biography = FFaker::Book.description
      title = FFaker::Book.title
      name = FFaker::Name.name
      email = FFaker::Internet.email
      city = FFaker::Address.city
      street = FFaker::Address.street_name
      house = rand(1 - 10_000)
      date = Time.now.utc.strftime('%d.%m.%Y')

      @authors.push(Author.new(authorname, biography))
      @books.push(Book.new(title, authorname))
      @readers.push(Reader.new(name, email, city, street, house))
      @orders.push(Order.new(title, name, date))
    end
  end
end

So i decided to create few private methods but still have big abcsize所以我决定创建一些私有方法但仍然有很大的 abcsize

class Library
  attr_accessor :authors, :books, :orders, :readers

  def initialize(authors = [], books = [], orders = [], readers = [])
    @books = books
    @orders = orders
    @readers = readers
    @authors = authors
  end

  def create_data
    create_arrays
    fill_arrays
  end
   
  private

  def create_arrays
    @authors = []
    @books = []
    @readers = []
    @orders = []
  end

  def fill_arrays
    100.times do
      authorname = FFaker::Book.author
      biography = FFaker::Book.description
      title = FFaker::Book.title
      name = FFaker::Name.name
      email = FFaker::Internet.email
      city = FFaker::Address.city
      street = FFaker::Address.street_name
      house = rand(1 - 10_000)
      date = Time.now.utc.strftime('%d.%m.%Y')

      @authors.push(Author.new(authorname, biography))
      @books.push(Book.new(title, authorname))
      @readers.push(Reader.new(name, email, city, street, house))
      @orders.push(Order.new(title, name, date))
    end
  end
end

I can't really separate that ffaker part because:我无法真正将那个 ffaker 部分分开,因为:

  1. Author from Books must be an instance of Author class.书籍中的作者必须是作者 class 的实例。
  2. Book from Orders, must be an instance of Book class. Book from Orders,必须是 Book class 的实例。

Would really appreciate if someone could help me, don't have much experience at refactoring如果有人可以帮助我,我将不胜感激,在重构方面没有太多经验

Method separation partially worked as @Sergii-k suggested but now i have some troubles with associations方法分离部分按照@Sergii-k 的建议工作,但现在我在关联方面遇到了一些麻烦

class Library
  attr_accessor :authors, :books, :orders, :readers

  def initialize(authors: [], books: [], orders: [], readers: [])
    @books = books
    @orders = orders
    @readers = readers
    @authors = authors
  end

  def create_arrays
    @authors = []
    @books = []
    @readers = []
    @orders = []
  end

  def create_data
    create_arrays
    fill_arrays
  end

  def show
    create_data
    puts @authors
    puts @books
    puts @orders
    puts @readers
  end

  def build_author
    name = FFaker::Book.author
    biography = FFaker::Book.description
    Author.new(name, biography)
  end

  def build_book(author)
    title = FFaker::Book.title
    Book.new(title, author.name)
  end

  def build_reader
    name = FFaker::Name.name
    email = FFaker::Internet.email
    city = FFaker::Address.city
    street = FFaker::Address.street_name
    house = rand(1 - 10_000)
    Reader.new(name, email, city, street, house)
  end

  def build_order(reader)
    date = Time.now.utc.strftime('%d.%m.%Y')
    title = FFaker::Book.title
    Order.new(title, reader.name, date)
  end

  def fill_arrays
    1.times do
      author = build_author
      reader = build_reader

      @authors.push(author)
      @books.push(build_book(author))
      @readers.push(reader)
      @orders.push(build_order(reader))
    end
  end
end

 

This is the problem part now这是现在的问题部分

  def build_book(author)
    title = FFaker::Book.title
    Book.new(title, author.name)
  end

  def build_order(reader)
    date = Time.now.utc.strftime('%d.%m.%Y')
    title = FFaker::Book.title
    Order.new(title, reader.name, date)
  end

I get 2 different titles now because i generate them in both methods.我现在得到了 2 个不同的标题,因为我在这两种方法中都生成了它们。 Tried to pass an arguments but it didn't work试图通过 arguments 但它没有用

  def build_order(book, reader)
    date = Time.now.utc.strftime('%d.%m.%Y')
    Order.new(book.title, reader.name, date)
  end

Done, works well!完成,效果很好!

class Library
  attr_accessor :authors, :books, :orders, :readers

  def initialize(authors: [], books: [], orders: [], readers: [])
    @books = books
    @orders = orders
    @readers = readers
    @authors = authors
  end

  def create_arrays
    @authors = []
    @books = []
    @readers = []
    @orders = []
  end

  def create_data
    create_arrays
    fill_arrays
  end

  def show
    create_data
    puts @authors
    puts @books
    puts @orders
    puts @readers
  end

  def build_author
    name = FFaker::Book.author
    biography = FFaker::Book.description
    Author.new(name, biography)
  end

  def build_book(author)
    title = FFaker::Book.title
    Book.new(title, author.name)
  end

  def build_reader
    name = FFaker::Name.name
    email = FFaker::Internet.email
    city = FFaker::Address.city
    street = FFaker::Address.street_name
    house = rand(1 - 10_000)
    Reader.new(name, email, city, street, house)
  end

  def build_order(book, reader)
    date = Time.now.utc.strftime('%d.%m.%Y')
    Order.new(book.title, reader.name, date)
  end

  def fill_arrays
    1.times do
      author = build_author
      reader = build_reader
      book   = build_book(author)

      @authors.push(author)
      @books.push(book)
      @readers.push(reader)
      @orders.push(build_order(book, reader))
    end
  end
end

Here is log from yml file这是来自 yml 文件的日志

--- !ruby/object:Library
books:
- !ruby/object:Book
  title: Case of the Missing Hungry Imp
  author: Twila Mante
orders:
- !ruby/object:Order
  book: Case of the Missing Hungry Imp
  reader: Monty Feeney
  date: 19.03.2021
readers:
- !ruby/object:Reader
  name: Monty Feeney
  email: lamonica.friesen@williamson.com
  city: Croninport
  street: Pfeffer Neck
  house: 3002
authors:
- !ruby/object:Author
  name: Twila Mante
  biography: Ut porro deserunt voluptatem velit. Atque dicta labore ratione minima
    sapiente. Dolor doloremque dolorem harum sint. At voluptatum molestias adipisci
    vero. Perspiciatis rerum nesciunt maiores vitae.

You can go further with method separation:您可以通过方法分离进一步 go :

def build_author
  # ...
  Author.new(authorname, biography)
end

def build_book(author)
  # ...
  Book.new(title, author.authorname)
end

def build_reader
  # ...
  Reader.new(name, email, city, street, house)
end

def build_order(book, reader)
  # ...
  Order.new(book.title, reader.name, date)
end

def fill_arrays
  100.times do
    author = build_author
    reader = build_reader
    book   = build_book(author)

    @authors.push(build_author)
    @books.push(book)
    @readers.push(reader)
    @orders.push(build_order(book, reader))
  end
end

UPDATE: I've noticed, that some parameters are shared across methods.更新:我注意到,一些参数是跨方法共享的。 You can pass them as an arguments.您可以将它们作为 arguments 传递。

UPDATE: Fixed book title.更新:固定书名。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM