我正在使用遗留应用程序,其中方法返回一些大的关联数组。
添加功能时,很难阅读/理解,因为在开发过程中,很难不费力地建立给定类中每个方法是否返回正确的数组键。
我知道通过编程到接口,您正在执行合同 - 很好,但不能解决强制返回类型的问题。
此外,如果返回类型是关联数组,如果返回的数组不包含正确的数组键,我需要一种以编程方式抛出异常的方法。
除了创建一个验证类作为中间层之外,还有一种合理的方法可以强制执行关联数组中返回的内容吗?
答案 0 :(得分:1)
假设您有一个遗留方法返回带有键foo
和bar
的数组:
function some()
{
return array('foo' => 'x', 'bar' => 2);
}
您需要确保此阵列还需要bar
和qux
个密钥,因为遗留代码不可扩展且您需要它。处理方法的响应,如下面的列表所示:
function ensure(array $arr)
{
$keys = array('foo', 'bar', 'baz', 'qux');
return array_merge(array_fill_keys($keys, null), $arr);
}
$expected = ensure(some());
这样,$arr
中设置的所有值都将替换数组中的默认null
,您将不会遇到“key not exists”错误。您可以使用array_merge()
独立调用,使用一些装饰器包装遗留方法,但解决方案无论哪种方式都可以。
如果您想在遗留方法没有返回内容时抛出异常,您可以类似地使用array_diff_key()
:
function check(array $arr)
{
$keys = array('foo', 'bar', 'baz', 'qux');
if(array_diff_key(array_fill_keys($keys, null), $arr)
{
throw new \RuntimeException('Invalid data returned!');
}
}
$expected = ensure(some());