避免滥用控制语句
函数至多有一行锁进
不要用else关键字
代码多层嵌套
if和else
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public double getEpubPrice(final boolean highQuality, final int chapterSequence) { double price = 0; if (highQuality && chapterSequence > START_CHARGING_SEQUENCE) { price = 4.99; } else if (sequenceNumber > START_CHARGING_SEQUENCE && sequenceNumber <= FURTHER_CHARGING_SEQUENCE) { price = 1.99; } else if (sequenceNumber > FURTHER_CHARGING_SEQUENCE) { price = 2.99; } else { price = 0.99; } return price; }
|
修正:消除else,一个简单的做法就是让逻辑提前返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public double getEpubPrice(final boolean highQuality, final int chapterSequence) { if (highQuality && chapterSequence > START_CHARGING_SEQUENCE) { return 4.99; } if (sequenceNumber > START_CHARGING_SEQUENCE && sequenceNumber <= FURTHER_CHARGING_SEQUENCE) { return 1.99; }
if (sequenceNumber > FURTHER_CHARGING_SEQUENCE) { return 2.99; }
return 0.99;
|
重复的switch
之所以出现重复的switch,通常是缺少了模型,重构的方式是:以多态取代表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public double getBookPrice(final User user, final Book book) { double price = book.getPrice(); switch (user.getLevel()) { case UserLevel.SILVER: return price * 0.9; case UserLevel.GOLD: return price * 0.8; case UserLevel.PLATINUM: return price * 0.75; default: return price; } }
public double getEpubPrice(final User user, final Epub epub) { double price = epub.getPrice(); switch (user.getLevel()) { case UserLevel.SILVER: return price * 0.95; case UserLevel.GOLD: return price * 0.85; case UserLevel.PLATINUM: return price * 0.8; default: return price; } }
|
修正:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| interface UserLevel { double getBookPrice(Book book); double getEpubPrice(Epub epub); }
class RegularUserLevel implements UserLevel { public double getBookPrice(final Book book) { return book.getPrice(); } public double getEpubPrice(final Epub epub) { return epub.getPrice(); }
class GoldUserLevel implements UserLevel { public double getBookPrice(final Book book) { return book.getPrice() * 0.8; } public double getEpubPrice(final Epub epub) { return epub.getPrice() * 0.85; } }
class SilverUserLevel implements UserLevel { public double getBookPrice(final Book book) { return book.getPrice() * 0.9; } public double getEpubPrice(final Epub epub) { return epub.getPrice() * 0.85; } }
class PlatinumUserLevel implements UserLevel { public double getBookPrice(final Book book) { return book.getPrice() * 0.75; } public double getEpubPrice(final Epub epub) { return epub.getPrice() * 0.8;
|
1 2 3 4 5 6 7 8 9 10 11
| public double getBookPrice(final User user, final Book book) { UserLevel level = user.getUserLevel() return level.getBookPrice(book); }
public double getEpubPrice(final User user, final Epub epub) { UserLevel level = user.getUserLevel() return level.getEpubPrice(epub); }
|