如何简化 if - else 语句?

Posted

技术标签:

【中文标题】如何简化 if - else 语句?【英文标题】:How can I simplify the if - else statements? 【发布时间】:2020-12-30 17:44:46 【问题描述】:

我完成了一个 - 非常菜鸟的创建,因为我仍然是菜鸟 :( - 充当银行账户的程序。

我有main.cppAccount.cppAccount.h

main.cpp 我有:

#include <iostream>
#include <string>
#include "Account.h"

int main()
   
    Account Luigis;
    Luigis.set_name("Luigi's Account");
    Luigis.set_balance(0);
    std::string letter;
   
do  
    std::cout << "Your current balance is: " << Luigis.get_balance() << std::endl;
    std::cout << "What would you like, to deposit, to withdraw or to exit?" << std::endl;
    std::cout << "(D for 'Deposit, W for 'Withdraw' and Q for 'Exit') D/W/Q ";
    std::cin >> letter;
    if(letter == "d" || letter == "D") 
        std::cout << "How much would you like to deposit?: ";
        double amountDeposit;
        std::cin >> amountDeposit;
        Luigis.deposit(amountDeposit);
    
        else if(letter == "w" || letter == "W") 
            std::cout << "How much would you like to withdraw?: ";
            double amountWithdraw;
            std::cin >> amountWithdraw;
            Luigis.withdraw(amountWithdraw);
        
            else if(letter == "q" || letter == "Q") 
                std::cout << "Goodbye!" << std::endl;
            
                else 
                std::cout << "Invalid selection, please try again with: D for Deposit, W for Withdraw, Q for Exist" << std::endl;
                
    
     while (letter != "q" && letter != "Q");
    
    return 0;

Account.cpp 我有:

#include "Account.h"
#include <string>
#include <iostream>
//IMPLEMENTATION or DEFINITION

bool Account::deposit(double amount) 
    //money you're doing to deposit
    balance = balance + amount;
    

bool Account::withdraw(double amount) 
        //if you can withdraw
        if(balance-amount >= 0) 
             balance = balance - amount;
             return true;
             else 
                std::cout << "You cannot withdraw the specified amount - balance is too low and it would result in " << balance - amount << " funds!" << std::endl;
                return false;
                
        
    
void Account::set_name(std::string name) 
        this->name = name;
        

std::string Account::get_name()
        return name;
        

void Account::set_balance(double balance) 
        this->balance = balance;
    

double Account::get_balance() 
        return balance;
    

Account.h 我有:

#ifndef _ACCOUNT_H_
#define _ACCOUNT_H_
#include <string>
//SPECIFICATION or DECLARATION


class Account

private:
    //attributes
    std::string name;
    double balance;
public:
    //methods
    bool deposit(double amount);
    bool withdraw(double amount);
    void set_name(std::string name);
    std::string get_name();
    void set_balance(double balance);
    double get_balance();
;

#endif // _ACCOUNT_H_

我的问题是:既然我“知道”如何使用函数,我该如何简化main.cpp 中的if-else 语句?我的朋友说我应该可以使用函数并将事情变得更抽象,以避免编写所有ifelse语句。

基本上,我将 OOP 与过程编程混合在一起,这违背了目的。

【问题讨论】:

(1) 除了缩进之外,我认为您的 if-else 语句没有任何实际问题。 (2) 提取每个 if-else 的主体可能会使其更具可读性,并且是微不足道的。 (3) 如果您想完全避免 if-and else,您将需要一个映射,但这通常会导致 less 可读代码。 tldr;我认为您的代码很好(缩进除外) 您有太多与您的问题完全无关的代码。请创建一个minimal reproducible example(强调“最小”) 如果字母始终是单个字符,您可能可以使用char,而不是std::string 并使用switch 语句 折叠箱子? letter = toupper(letter); ... if (letter == 'Q')switch (toupper(letter)) case 'Q': ...? 【参考方案1】:

我认为您对条件构造的复杂性有一种夸大的印象。对我(以及至少 5 个其他人,从 cmets 和“同意”得到的结果来看)它们似乎并不过分复杂。

因此,我提出了一些改变您印象的方法,尽管它根本不会改变功能: 请应用一致且严格的缩进,实际样式无关紧要。 如果您允许我提出我最喜欢的风格,以下是结果示例:

if(letter == "d" || letter == "D")

    std::cout << "How much would you like to deposit?: ";
    double amountDeposit;
    std::cin >> amountDeposit;
    Luigis.deposit(amountDeposit);
 else if(letter == "w" || letter == "W")

    std::cout << "How much would you like to withdraw?: ";
    double amountWithdraw;
    std::cin >> amountWithdraw;
    Luigis.withdraw(amountWithdraw);
 else if(letter == "q" || letter == "Q")

    std::cout << "Goodbye!" << std::endl;
 else 

    std::cout << "Invalid selection, please try again with: D for Deposit, W for Withdraw, Q for Exist"
              << std::endl;

【讨论】:

以上是关于如何简化 if - else 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何简化此 if 语句?

使用大量 if-else 语句和 JSON 化简化 PL/pgSQL 函数

我的 if else 语句未按预期工作-所有语句的 innerHTML 保持不变

如何少写if-else

一万个if..........else....语句,请问如何去优化它。。。。以提升性能效率

IT兄弟连 Java语法教程 流程控制语句 分支结构语句2