Gis*_*shu 6 language-agnostic oop
背景:我需要向一组混合体验解释"组合方法".
我想我在阅读Beck的Smalltalk最佳实践时首先听说过它.我个人在编写这样的方法时没有太多问题 - 但是在当地的代码荒野中,我已经看到很多情况,缺乏组合方法创造了难以理解的Blob ......我是少数.所以我带他们通过CleanCode - 这个再次弹出.
前提很简单.
"函数应该简短,做一件事并且有一个有意图的名称.方法体中的每一步都应该处于相同的抽象层次."
我正在努力检查"同一级别的抽象"...即原谅对于初学者来说有点抽象的双关语.
我目前的解释与SICP的"一厢情愿"相似.(想象一下理想的一系列步骤,然后担心实施/实现它.").
在编写组合方法时,是否有人有更好的规则/酸测试来评估您的决定?
Bon*_*nyT 13
相同级别的抽象 - 示例:
void DailyChores()
{
Dust();
Hoover();
MopKitchenFloor();
AddDirtyClothesToWashingMachine();
PlaceDetergentInWashingMachine();
CloseWashingMachineDoor();
StartWashingMachine();
Relax();
}
Run Code Online (Sandbox Code Playgroud)
希望很明显,WashingMachine的传奇故事可以更好地提取到一个单独的方法中,包括WashDirtyLaundry();
可以说,MopKitchenFloor也应该在一个名为CleanKitchen()的单独方法中,因为您很可能希望将来扩展它包括WashPots(),DefrostFridge()等.
所以更好的方法是编写如下:
void DailyChores()
{
Dust();
Hoover();
CleanKitchen(CleaningLevel.Daily);
WashDirtyClothes();
Relax();
}
void WashDirtyClothes()
{
AddDirtyClothesToWashingMachine();
PlaceDetergentInWashingMachine();
CloseWashingMachineDoor();
StartWashingMachine();
}
void CleanKitchen(CleaningLevel level)
{
MopKitchenFloor();
WashPots();
if(level == CleaningLevel.Monthly)
{
DefrostFridge();
}
}
enum CleaningLevel
{
Daily,
Weekly,
Monthly
}
Run Code Online (Sandbox Code Playgroud)
在适用于不遵循此原则的代码的"规则"方面:
1)你能描述一下这个方法在没有任何连词(例如"和")的单句中的作用吗?如果没有拆分,直到可以.例如,在示例中,我将AddDirtyClothesToWashingMachine()和PlaceDetergentInWashingMachine()作为单独的方法 - 这是正确的 - 让一个方法中的这两个单独任务的代码错误 - 但请参阅规则2.
2)你可以将类似方法的调用组合成一个更高级别的方法,可以在一个句子中描述.在该示例中,与洗涤衣物有关的所有方法被分组为单个方法WashDirtyClothes().或者考虑到规则1,可以从单个方法AddStuffToWashingMachine()调用AddDirtyClothesToWashingMachine()和PlaceDetergentInWashingMachine()方法:
void AddStuffToWashingMachine()
{
AddDirthClothesToWashingMachine();
PlaceDetergentInWashingMachine();
}
Run Code Online (Sandbox Code Playgroud)
3)循环中是否有任何循环不仅仅包含一个简单的语句?任何循环行为都应该是一个单独的方法.同样适用于switch语句,或if,then else语句.
希望这可以帮助
我接受"酸测试"意味着你想要一些有助于体现抽象概念的具体规则.如同"如果......你可能有混合的抽象层次"
如果......你可能有混合的抽象级别
我希望其他人会加入上述......