Ruby方法返回最佳实践

时间:2017-01-09 14:48:17

标签: ruby

我有一个查看变量和返回的方法,具体取决于这些变量是什么:

def os_detect(os, zone)
  if os.start_with?('centos')
      unless zone == 'aws'
        if os == 'centos7'
            #puts "Not available yet"
            return nil
        end
      end
  else
      #puts "Invalid OS Type"
      return nil
  end
  return true
end

我正在为CLI和Rails构建,所以我试图摆脱看跌......但我仍然想向用户解释发生了什么。

我应该只返回字符串,如果没有阻塞,则为true吗?

在Ruby中有更好的方法来处理这种类型的逻辑吗?

更新:我的问题的主要目的是了解如何根据逻辑将上下文传递给用户。

因此,此方法在aws上返回centos7的 false ,或者除了centos *之外的任何其他操作系统。

用户如何知道错误以及如何解决?

2 个答案:

答案 0 :(得分:4)

解决方案

只是布尔

如果我正确理解了您的代码,则'centos'以外的区域'centos7'除了'aws'以外的所有def os_supported?(os, zone = '') os.start_with?('centos') && (zone == 'aws' || os != 'centos7') end

nil

布尔和警告信息

使用2种方法可能是个好主意:一种方法在需要时返回警告,另一种方法返回truedef os_support_warning(os, zone = '') return 'Invalid OS Type' unless os.start_with?('centos') return 'Not available yet' if os == 'centos7' && zone != 'aws' end def os_supported?(os, zone = '') warning = os_support_warning(os, zone) if warning puts warning else true end end

true/false

如果您接受true/nil而不是def os_supported?(os, zone = '') warning = os_support_warning(os, zone) puts warning if warning warning.nil? end ,则可以使用:

false

nil%w(centos6 centos7 windows macosx).each do |os| %w(aws not_aws).each do |zone| @os = os @zone = zone puts '--------------------------' puts "OS : #{os}\t Zone : #{zone}" puts "#######BAD#######" if os_detect != os_supported?(os, zone) end end 都是假的:对于布尔逻辑,它们完全相同。

测试

要检查我们的方法是否相同,我使用:

--------------------------
OS : centos6     Zone : aws
--------------------------
OS : centos6     Zone : not_aws
--------------------------
OS : centos7     Zone : aws
--------------------------
OS : centos7     Zone : not_aws
Not available yet
Not available yet
--------------------------
OS : windows     Zone : aws
Invalid OS Type
Invalid OS Type
--------------------------
OS : windows     Zone : not_aws
Invalid OS Type
Invalid OS Type
--------------------------
OS : macosx  Zone : aws
Invalid OS Type
Invalid OS Type
--------------------------
OS : macosx  Zone : not_aws
Invalid OS Type
Invalid OS Type

输出

$data = [
    't_type_id' => request()->input('options'),
    'd_id'      => $id,
    'result'    => request()->input('message'),
    'date'      => $time->toDateTimeString()
];

TN::update($data); // this will update all TN entries

它们都返回相同的布尔值并发出相同的警告。

答案 1 :(得分:0)

我会试着更抽象地回答这个问题。我看到它的方式,你要问两件事:

  1. 如何简化布尔表达式?
  2. 使用什么语法结构,以便您可以添加一些额外的副作用(在这种情况下打印)?
  3. 如何简化布尔表达式?

    将英语句子翻译成Ruby。通常有1:1的映射。对位也是如此 - 您可以将您的Ruby代码读作英语句子,以听听它是否真的听起来可以理解。首先,让我们阅读您当前的实现:

    def os_detect(os, zone)
      if os.start_with?('centos')
        unless zone == 'aws'
          if os == 'centos7'
            return nil
          end
        end
      else
        return nil
      end
      return true
    end
    
      

    如果操作系统是 centos ,除非 aws ,如果操作系统是 centos7 ,则此功能不可用,否则 - 您的操作系统被视为无效。如果没有 - 我们确实支持这种环境。

    即使使用标点符号(或代码中的缩进),您也必须停下来思考一下以提取它的本质。是的,与英语不同的代码具有明确的特权,但这并不能使其可理解

    现在让我们尝试将英语翻译成Ruby。用你自己的话说:

      

    此方法为 aws 上的 centos7 centos

    之外的任何其他操作系统返回false
    def os_detect(os, zone) # "this method"
      return false if os =='centos7' && zone == 'aws' || !os.start_with?('centos')
    end
    

    现在您可能会发现您的描述与您实际想要的内容不符。那是因为你真正想说的是:

      

    此方法确定是否我们在 aws 上运行 centos7 或除 centos 之外的任何其他操作系统 p>

    def os_detect(os, zone) # "this method"
      os =='centos7' && zone != 'aws' || !os.start_with?('centos')
    end
    

    使用什么语法结构,以便您可以添加一些附加的副作用(在这种情况下打印)?

    这又取决于你想要如何构建你的句子。主要是你将在最终return之前使用任何一个保护条件或在实际条件下打印(类似于你所做的,但是可读的)。让我们试试:

      

    如果在 aws 上检查 centos7 ,则此方法表示该功能尚不可用。它表示除非检查 centos ,否则目标操作系统无效。最后,它确定是否我们在 aws centos之外的任何其他操作系统上运行 centos7 而不是

    def os_detect(os, zone) # "this method"
      puts 'Not available yet' if os == 'centos7' and zone != 'aws'
      puts 'Invalid OS Type' unless os.start_with?('centos')
    
      os =='centos7' && zone != 'aws' || !os.start_with?('centos')
    end
    
      

    此方法表示该功能尚不可用,如果在 aws 上检查 centos7 ,则退出该功能。它表示除非检查 centos ,否则目标操作系统无效且存在。否则会给出绿灯。

    def os_detect(os, zone) # "this method"
      if os == 'centos7' and zone != 'aws'
        puts 'Not available yet'
        return
      end
    
      unless os.start_with?('centos')
        puts 'Invalid OS Type'
        return
      end
    
      true
    end