我的问题目前与设计有关。我有一个jsf参数页面,它提交 生成jasper报告的不同参数。例如。国籍,旅行类型,签证类型, 性别等。参数可以是组合。例如。用户可以一次选择 国籍和visatype并留下其他人的空白,这将使其他人的默认值 全部。我从参数页面提交了id。如果我没有选择任何用户 在setter方法中手动将值设置为ALL。这是我托管的快照 bean方法和POJO。
private ReportBean generateReportBean(TravelDetailSearchParams searchParams, String reportPath){
TravelDetailReportBean travelDetailReportBean = new TravelDetailReportBean();
if(searchParams.getGender().getId() != 0){
for(Lookup lookup : gender){
if(lookup.getId() == searchParams.getGender().getId()){
travelDetailReportBean.setGender(lookup.getDescEnglish());
break ;
}
}
}
else{
travelDetailReportBean.setGender(searchParams.getGender().getDescEnglish());
}
if(searchParams.getTravelType().getId() != 0){
for(Lookup lookup : travelType){
if(lookup.getId() == searchParams.getTravelType().getId()){
travelDetailReportBean.setTravelType(lookup.getDescEnglish());
break ;
}
}
}
else{
travelDetailReportBean.setTravelType(searchParams.getTravelType().getDescEnglish());
}
if(searchParams.getPort().getId() != 0){
for(Lookup lookup : port){
if(lookup.getId() == searchParams.getPort().getId()){
travelDetailReportBean.setPort(lookup.getDescEnglish());
break ;
}
}
}
else{
travelDetailReportBean.setPort(searchParams.getPort().getDescEnglish());
}
if(searchParams.getNationality().getId() != 0){
for(Lookup lookup : country){
if(lookup.getId() == searchParams.getNationality().getId()){
travelDetailReportBean.setCountry(lookup.getDescEnglish());
break ;
}
}
}
else{
travelDetailReportBean.setCountry(searchParams.getNationality().getDescEnglish());
}
if(searchParams.getVisaType().getId() != 0){
for(Lookup lookup : visaType){
if(lookup.getId() == searchParams.getVisaType().getId()){
travelDetailReportBean.setVisaType(lookup.getDescEnglish());
break ;
}
}
}
else{
travelDetailReportBean.setVisaType(searchParams.getVisaType().getDescEnglish());
}
logger.debug("nationality: " + travelDetailReportBean.getCountry());
logger.debug("travelType: " + travelDetailReportBean.getTravelType());
logger.debug("visatype: " + travelDetailReportBean.getVisaType());
logger.debug("port: " + travelDetailReportBean.getPort());
travelDetailReportBean.setReportName(BorderEntryExitConstants.TRAVEL_DETAIL_REPORT_NAME);
travelDetailReportBean.setReportPath(reportPath);
return travelDetailReportBean ;
}
POJO代码如下所示
public class TravelDetailReportBean extends ConcreteReportBean {
private String gender ;
private String travelType ;
private String port ;
private String country ;
private String visaType;
public String getGender() {
return gender;
}
public void setGender(String gender) {
if(gender == null || gender.equals("")){
this.gender="ALL";
}
else{
this.gender = gender;
}
}
public String getTravelType() {
return travelType;
}
public void setTravelType(String travelType) {
if(travelType == null || travelType.equals("")){
this.travelType ="ALL";
}
else{
this.travelType = travelType;
}
}
public String getPort() {
return port;
}
public void setPort(String port) {
if(port == null || port.equals("")){
this.port ="ALL";
}
else{
this.port = port;
}
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
if(country == null || country.equals("")){
this.country ="ALL";
}
else{
this.country = country;
}
}
public String getVisaType() {
return visaType;
}
public void setVisaType(String visaType) {
if(visaType == null || visaType.equals("")){
this.visaType ="ALL";
}
else{
this.visaType = visaType;
}
}
}
问题是generateReportBean方法。我正在向很多人提出如果不知道id是不是 零从查找中获取该id的描述,否则只需将其设置为内部bean 我正在检查null的setter。如果为null,则将其设置为ALL。
我的问题是目前我的参数很少,如果可以使用一段时间,那会是什么 如果搜索参数增长。如果它看起来很难看。有人可以建议我一个更好的方法 摆脱这些如果是。 谢谢, 彼得
答案 0 :(得分:1)
如果Lookup
是对象列表,那么您可以提供基于id
的等于方法,然后您可以直接执行
if(lookup.contains(searchParams.getTravelType()))
{
//code here
}
答案 1 :(得分:1)
遵循责任链设计模式。
这将提高代码的可读性和可维护性
减少“if”循环次数
参考:http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern
答案 2 :(得分:0)
将解析部分划分为不同的功能。例如
checkgender(searchParams.getGender(), travelDetailReportBean);
或
travelDetailReportBean.setGender(checkgender(searchParams.getGender()));
取决于你想要的方式
答案 3 :(得分:0)
是的,您可以将这些方法放入实用程序类中,并按照Minion的建议进行操作。
travelDetailReportBean.setGender(ParamUtil.checkGender(searchParams.getGender());
如你所做的那样将验证条件放在dto中并不是一个聪明的编码动作。它是通用的吗? 你想要制作的参数屏幕?通常,每个报告都应该有一个单独的参数 屏幕,如果每个报告参数不同 HTH, 本
答案 4 :(得分:0)
对于空/空字符串的IMHO测试太常见了,无法手动编码。我喜欢使用StringUtils中的Apache Commons lang来简化它。结合Java的?
运算符,您可以更清楚地编写它:
private static final String OPTION_ALL = "ALL";
public void setGender(String gender) {
this.gender = StringUtils.isEmpty(gender) ? OPTION_ALL : gender;
}
当然,如果您拥有大量字段,则通用方法可能是合理的。
编辑:概念性考虑
正如我所见,您在类setter方法中执行值检查。我建议不要这样做:我希望setter只能 为实例变量赋值。如果他们做得更多,这可能会导致混乱。您可能正在使用该类来参数化某些搜索功能,因此在执行该搜索之前,确保非空成员值的更好位置是正确的。
答案 5 :(得分:0)
您也可以注释执行查找所需的字段,然后使用单个循环在searchParams中查看其值,如果存在id,则执行查找。