我正在研究(并且实际上已经完成)一个项目,该项目根据用户输入的数据获取报价。我已经编写了代码并且工作正常。它是用javascript / jQuery编写的,使用事件和函数,更像是这样的(我刚刚为这个问题编写的例子,而不是实际的代码):
// event - when the quantity field changes
$('input[name=quantity]').change(function(){
// get the product
var product = $('input[name=product]').val();
// run function to set the base price
setBasePrice(this.value,product);
});
// function - set the base price
function setBasePrice(quantity,product){
var basePrice = quantity * getTierPrice(quantity,product);
// show the base price to user
$('.basePrice').empty().val(basePrice);
};
// function - set price based on quantity and product
function getTierPrice(quantity,product){
// switches through 6 tiers (based on quantity)
// e.g. - If product is x and quantity is y, price = z
// returns a value
};
还有更多的工作部分,但我写了这篇文章来说明它是如何组合在一起的。它看起来真的很冗长,而且动作很多。当需要更新时,这很痛苦。
但是我想知道我是否应该使用OOP这样的东西?我真的只想找到javascript最佳实践的根源,并找出这样的东西应该真正放在一起。我觉得我编写的代码很多,虽然有效,并不总是最好的方式,也许是因为我是自学成才并且没有真正深入挖掘。
如果它有助于理解正在发生的事情,我将功能分解成碎片。了解每个位的工作原理并不重要:
Things I'm expecting
= zip code (number)
= product (string)
= quantity (number)
- Need to verify number is between x and y (e.g. - 100 to 10000)
= artwork colors (number)
- Need to verify number is between x and y (e.g. - 0 to 6)
Things I'm calculating
= base price (number)
- Depends on the product selected
- Depends on the quantity entered (6 tiers of pricing based on quantity)
e.g. - "Product 1" quantity of 101 to 200 = $9, quantity of 201 to 300 = $7, etc
= screen charge (number)
- Depends on the number of artwork colors entered
- Depends on the quantity entered (uses same tier as when calculating base price)
e.g. - "Product 1" quantity of 101 to 200 add 1.00 per artwork color
- Gets rolled into the base price
e.g. - base price = base price + (artwork colors*quantity);
= shipping cost (hits url via ajax to fetch rate, returns number)
- Depends on zip code entered
- Depends on product selected (each product has different weight)
Things I need to output
= final price
= shipping cost
= base price
我应该使用OOP,我应该查看YUI Module Pattern吗?如果是这样,在高层次上,我将如何开始?我不需要完整的代码示例,只需要了解从哪里开始。我真的希望我的代码看起来很好并且结构合理。非常感谢任何建议,资源链接等。
答案 0 :(得分:3)
您可以做的是研究MVC范例 - 逻辑的架构分离,旨在将代码的组件抽象为模型,视图和控制器。它主要用于后端语言的框架(用于PHP的CakePHP,用于Ruby的Rails,用于Python的Django等),但绝对也适用于JS。
请参阅this post以获取一些方便的参考资料。就个人而言,Backbone似乎是一个轻松轻松的开始(它支持jQuery(我也看到你提到))。
答案 1 :(得分:3)
我的一般测试“我应该将这一大块自由浮动函数放入类的一组方法中”(适用于任何语言,而不仅仅是JS),这很简单:我是否在所有方法中传递相同的变量在那个地方?
如果是这样,我认为将这些变量放入类的字段,然后将这些函数放入方法中是有帮助的,因为所有这些方法都可以引用所有这些变量,而不必传递所有内容围绕“手工”。此外,你可以通过这种方式更好地控制事物。
例如,假设您有几个函数接受“foo”参数并在其上调用“setBar”,然后在其上设置“脏”标志。使用该设置,很容易意外忘记设置“脏”标志。但是,通过使foo成为字段,并创建setFooBar方法(调用“setBar”并设置“脏”标志),可以确保始终设置“脏”标志。
无论如何,我无法从您提供的有限代码示例中看出您的代码是否通过了测试,但希望这会让您有所思考。
答案 2 :(得分:1)
只有功能脚本才能完成的所有javascript工作都可以通过oop脚本完成,反之亦然 在大多数情况下,使用javascript作为OOP语言更优雅,更强大,但不一定更有效 当我开始使用javascript OOP基础时,我对原型继承非常着迷,我每次都使用对象......直到我意识到我使一切变得复杂(例如:代替普通的2行图像预加载器脚本,我开始编写ImgObjects,它比我原来的任务要复杂得多。) 从您提供的小代码中,我无法确定OOP是否会对您的项目带来重大改进,但我建议您在原型继承和maby一些设计模式(this book是惊人的)上达到顶峰,但不要不要忘记javascript是一种功能齐全的语言!
答案 3 :(得分:1)
我总是推广oop!我认为javascript作为oop语言工作得很好。有一本名为“javascript模式”的书来自o'reilly。它是由一位名叫stoyan stefanov的雅虎大师编写的,它非常善于解释何时在js中使用oop,以及如何以一种好的方式进行操作。
根据这本书,我认为你会创建一个对象,它有一个构造函数来获取你的输入数据,验证它,然后保存给成员。然后它会有一些方法来执行你所写的计算。并且这些计算将在对象创建期间存储的成员的帮助下进行。
这是一个示例类:
//class named SomeClass
//constructor taking two arguments named init1 and init2
function SomeClass(init1, init2) {
//members, use of keyword "var" makes them private
//logic makes the members have validated values, if input is not satisfying
var m_init1 = init1 > 5 ? init1 : 5;
var m_init2 = init2;
//so that was the constructor
//well, this is still the constructor, but
//conceptually, it's not anymore.
//here are some public things
//they are method calls, and they represent functions
//that are private in here, but are made public through
//the use of this.bla = Bla;
this.publicMethod = PublicMethod;
this.otherPublicMethod = OtherPublicMethod;
//private function, made into a public method above
function PublicMethod() {
//this function/method has access to private members
//of parent function object. yay!
return m_init1;
};
//private function, made into a public method above
function OtherPublicMethod(arg) {
if(arg > 5) {
m_init2 = arg;
}
};
}
var a = new SomeClass(2, 3);
alert(a.publicMethod()); //outputs 5
您构建上述信息的方式是构建oop项目的文档的非常好的基础。它看起来像我认为的一个类。我所说的是,好像你的文档模型适合我的小代码示例。
答案 4 :(得分:0)
我不会担心OOP与非OOP相比而不是重构 - 例如如果你有非常相似的“setBasePrice”和“setXXX”和“setYYY”,你应该将它们转换为通用的“setAnything()”调用。 OOP可能有助于完成这项任务,但并不重要