我正在寻找最简洁的方法来确定价值而不使用多个if语句(或switch-case)。
如您所见,我需要先考虑5个变量,然后才能确定确切的值。
使用if语句会导致嵌入ifs的噩梦。
我有两个解决方案:
非常脏 - 地图等地图的地图:
Map<String, Map<String, Map<String,...>>> myMappings;
涉及大量代码:带有子工厂的工厂导致最终值 - 实际上这对于可读性来说更好,但这仍然是封装在类中的if语句。
你有什么想法?
答案 0 :(得分:3)
您可以通过引入复合键来解决此问题。只需将所有字段添加到其中,即可正确覆盖add_action( 'pre_get_posts', function ( $q )
{
if ( !is_admin() // Only targets the front end
&& $q->is_main_query() // Only targets the main query
&& $q->is_tax( 'product-category' ) // Only targets the product-category tax pages
) {
$q->set( 'orderby', 'rand' );
}
});
和hashCode
。之后,您可以从某种equals
中获取并获取必要的值。
作为一个注册,并不是所有领域都包括在内,最好提出一个更有意义的名字:
Map<CompositeKey, TaxCode>
那么你可以:
public class CompositeKey {
private final int companyNumber;
private final String sweepType;
private final int vatRate;
public CompositeKey(int companyNumber, String sweepType, int vatRate) {
this.companyNumber = companyNumber;
this.sweepType = sweepType;
this.vatRate = vatRate;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CompositeKey that = (CompositeKey) o;
if (companyNumber != that.companyNumber) return false;
if (vatRate != that.vatRate) return false;
return Objects.equals(this.sweepType, that.sweepType);
}
@Override
public int hashCode() {
int result = companyNumber;
result = 31 * result + (sweepType != null ? sweepType.hashCode() : 0);
result = 31 * result + vatRate;
return result;
}
}
答案 1 :(得分:3)
就个人而言,我宁愿将所有这些值保存在表中,只考虑使用简单的SQL查询可以获得的最终值。您可以选择其他选项,但是您应该始终将这些映射保留在外部源(表,属性文件...)中,如果需求发生变化,您可以修改这些选项。