当前位置: 首页 > 知识库问答 >
问题:

正确应用封装

黎浩然
2023-03-14

我一直在研究封装的概念,发现了一些关于这个主题的不错的线索,比如这个和这个。但我还没能找到一个具体问题的答案。我将使用Swift中的一个示例。

假设你有一个RoadTrip类型的对象:

class RoadTrip() {
    private var duration: Double
    private var totalMiles: Double
    private var gallonsOfFuel: Double

    var averageMilesPerGallon: Double
}

现在让我们假设应用程序将计算AverageFileSpergallon,这是唯一的公共属性:

func calculateAverageMilePerGallon() -> Double {
    let mpg = totalMiles / gallonsOfFuel

    return mpg
}

每加仑平均英里数的计算是RoadTrip对象执行和更新其averageMilesPerGallon的私有方法,还是可以接受由单独实用程序类中的另一个方法执行计算,然后更新RoadTrip的averageMilesPerGallon属性对象是否使用将设置值的mutator方法?

编辑:这是我的一个类,包含我的应用程序的基本计算。我是根据我在iTunes上的斯坦福课程中学到的东西来处理这个问题的,但我开始想,在我的案例中,我应该把大部分内容转移到我的LiftEvent课程中:

infix operator ^^ { }
func ^^ (radix: Double, power: Double) -> Double {
    return Double(pow(Double(radix), Double(power)))
}

class CalculatorBrain: NSObject {
    var weightLifted: Double?
    var repetitions: Double?
    var oneRepMax: Double?
    let dataManager = LiftEventDataManager()

    func calculateOneRepMax(weightLifted: Double, repetitions: Int ) -> Double {
        let preferredFormulaID = UserDefaultsManager.sharedInstance.preferredFormula!
        let formulas = dataManager.fetchSelectableFormulas()
        let formulaName = formulas[preferredFormulaID].formulaName

        switch formulaName {
        case "Epley":
            oneRepMax = weightLifted * (1 + Double(repetitions)/30.0)
            return oneRepMax!
        case "Baechle":
            oneRepMax = weightLifted * (36/(37 - Double(repetitions)))
            return oneRepMax!
        case "Brzychi":
            oneRepMax = weightLifted * ( 1 + ( 0.033 * Double(repetitions)))
            return oneRepMax!
        case "Lander":
            oneRepMax = 100 * weightLifted / (101.3 - (2.67123 * Double(repetitions)))
            return oneRepMax!
        case "Lombardi":
            oneRepMax = weightLifted * (Double(repetitions) ^^ 0.10)
            return oneRepMax!
        case "Mayhew":
            oneRepMax = 100 * weightLifted / (52.2 + (41.9 * (2.71828 ^^ (-0.055 * Double(repetitions)))))
            return oneRepMax!
        case "O'Conner":
            oneRepMax = weightLifted * (1 + 0.025 * Double(repetithtml" target="_blank">ions))
            return oneRepMax!
        default:
            return 0.0
        }
    }


    private func calculatePercentOfWeight(maxWeight: Double, percent: Double) -> Double {
        return maxWeight * percent
    }

    func calculateWeightPercentages(maxWeight: String) -> [Int: Double] {
        let weightPercentages = [1.0, 0.95, 0.90, 0.85, 0.80, 0.75, 0.70, 0.65, 0.60, 0.55, 0.50, 0.45, 0.40, 0.35, 0.30, 0.25]

        var percentages = [Int: Double]()
        for percent in weightPercentages {
            let integerPercent = Int(percent * 100)
            percentages[integerPercent] = calculatePercentOfWeight(Double(maxWeight)!, percent: percent)
        }
        return percentages
    }

    func convertBetweenUnits(fromUnit: Int, toUnit: Int, value: Double) -> Double {
        let units = dataManager.fetchUnits()
        let from = units[fromUnit].conversionRatio as Double
        let to = units[toUnit].conversionRatio as Double
        let result = Double(value * to / from)
        return result
    }
}

共有1个答案

云炜
2023-03-14

我认为这是计算属性的理想用例:

class RoadTrip {
    private let duration: Double
    private let totalMiles: Double
    private let gallonsOfFuel: Double

    private var averageMilesPerGallon: Double {
        return totalMiles / gallonsOfFuel
    }
}
 类似资料:
  • 我正在更改特定信封的签名人,方法是使用以下代码更新收件人的签名,该代码工作正常 是否可以使用rest API获取故障状态信封并更新收件人电子邮件。 我想我们可以得到失败的信封,并用有效的收件人电子邮件更新收件人的

  • 我有一个quarkus应用程序,当我用下面的命令构建应用程序时,进程第一次开始完美地编译quarkus:dev-DskipTests=true 成功启动的日志: 但是当我停下来重新开始这个过程时,过程并没有开始... 启动失败的日志: 当我尝试重新启动机器,然后启动quarkus服务时,它会再次工作。 pom。xml: 如果有人遇到过类似的行为,请告诉我,这可能是什么根源。

  • 本文向大家介绍浅析vue cli3 封装Svgicon组件正确姿势(推荐),包括了浅析vue cli3 封装Svgicon组件正确姿势(推荐)的使用技巧和注意事项,需要的朋友参考一下 vue cli3 手把手教学封装Svgicon组件 第一步:在src文件下新建一个放置svg文件的文件夹 第二步:在components文件下新建一个Svg组件 这是一个 文件夹 专门用来存放项目里面需要使用的svg

  • 我正在将spring security应用于一个web应用程序,其中我需要执行以下操作: > 限制某些角色/权限对某些页面的访问 根据用户访问权限和用户角色限制对某些数据的访问(例如,管理员可以查看所有数据,用户只能查看管理员授予用户访问权限的数据) 允许根据用户拥有的访问权限对数据执行操作(读取、 管理等) 所以,我在想: 限制某些角色/权限对某些页面的访问- 现在,这是我想出了一个设置,但想知

  • 有人可以帮我吗? 我的应用程序,在Facebook上注册并设置为“实时”,有一个应用程序ID,一个密钥和一个令牌客户端。在我的应用程序中,用户A在脸书上执行登录,我得到IdA(这是应用程序范围的)。在我的应用程序中,用户B在Facebook上执行登录,我得到的IdB仍然是应用程序范围的。 现在,每当我尝试获取用户配置文件图片时,都会出现错误。这是我为用户A尝试的,用户B也一样: https://g