【问题标题】:How to design an application keeping SOLID principles and Design Patterns in mind如何在设计应用时牢记 SOLID 原则和设计模式
【发布时间】:2011-11-27 14:19:59
【问题描述】:

假设 ruby​​ 中的应用程序启动时有两种模式:命令行模式和文件模式

当给定参数ruby myprogram input.txt output.txt时,它会根据输入文件中的一些命令生成输出。同样,当没有提供任何参数时,它会为我们提供命令提示符。使用以下命令。

create_class_with_capacity 40

create_student_with_marks Alex 70

create_student_with_marks Mathew 30

create_student_with_marks John 55

..

create_student_with_marks Sylvia 70 etc...


fail_student_roll_no 12

=> Student with roll number 12 #{student} failed


give_marks_to_roll_no 70 1

=>Student with roll number 1 Alex got 70 marks


find_all_students_with_marks 70

=> Alex, Peter , Russell , Mark etc...

如何设计这样的应用程序,同时牢记 RSpec、TDD、Cucumber、SOLID 和模式。 我直接问的是这里的对象应该是什么来设计什么应该是模块(如果适用)等等。?以及如何衡量这里需要测试的内容和不需要测试的内容?在面向对象设计方面设计最合适的机制。

还请参阅一些书籍或博客以了解这些面向对象的 ruby​​ 设计原则和实践。

【问题讨论】:

    标签: ruby design-patterns rspec cucumber solid-principles


    【解决方案1】:

    你是说你必须写这个应用程序吗?这是作业吗?

    在我看来,您好像患有分析麻痹症。有太多的流行语在你脑海中盘旋。

    不要再担心模式和其他问题了。将问题分解成小块并开始编写一些代码。

    我要提出的一项建议是将 I/O 排除在我们的课程之外。将所有与与用户交互无关的逻辑放在基类中。这样,如果您被要求创建一个基于 Web 的 UI 来替换您的文本版本,它们仍然可以工作。

    必须测试什么?您认为可能会破坏的所有代码。

    最合适的面向对象设计方法?做显而易见的事情:名词是问题陈述中的潜在对象,动词是潜在方法。

    以下是我看到的一些潜在对象:Student、Course、Roll。

    以下是一些潜在的方法: 学生和课程的 CRUD 操作;设置成绩并将学生标记为不及格。

    没那么复杂。思考“简单”并让某些东西发挥作用,然后对其进行改进。

    更新:

    如果你能描述一下你做了什么,会更容易回答你。

    如果我认为是作业问题,我怀疑它会产生很大的不同。与其让我们猜测,不如您阅读 SOLID 并开始查看您创建的类,问问自己它是否符合这些原则。

    模式?高估了。不用担心他们。

    【讨论】:

    • 我已经编写了这个应用程序,但它可能在设计原则方面不正确,我只是在寻找一个线索,以了解如何以更 OOP 的方式设计它并遵循 SOLID 原则和编写测试。很难衡量要测试什么,不测试什么,以及要遵循什么模式。作为对象制作什么,单例等等......
    • 不,这是在面试前的问题集中提出的问题。更新:好的,我所做的是,在运行时我检测到是否提供了 ARGV,然后我制作了一个模块,其中包含需要作为方法实现的所有命令:create_class_with_capacity 40 这是一个以学生为参数的方法,在交互模式下,我评估提供给 REPL 循环的输入,而在文件模式下,我读取数组中的所有命令并单独评估命令。
    • 无论哪种情况,模块都在名为 Interactive 和 Filemode 的两个类中单独调用。所以所有命令都成为给定场景的实例方法。此外,每个学生都是散列中的一个开放结构。为方便起见选择了 Struct,例如 @student.marks、@student.status、@student.subjects 等...
    • 听起来你做得很好。你得到面试了吗?一份邀请?这才是最重要的。
    • 不,我没有得到任何回复,这就是为什么我开始认为这可能是错误的。我需要知道什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多