在编写组合函数/方法时,"同一抽象级别"的酸测试是什么?

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语句.

希望这可以帮助


Dan*_* T. 5

我接受"酸测试"意味着你想要一些有助于体现抽象概念的具体规则.如同"如果......你可能有混合的抽象层次"

如果......你可能有混合的抽象级别

  • 你在函数中有一个变量,它只用于部分函数.
  • 你在函数中有多个循环.
  • 你有多个if语句,他们的条件是相互独立的.

我希望其他人会加入上述......