JavaScript port of Ruby library Scientist, carefully refactoring critical paths
KattieHead
9年前
来自: https://github.com/ziyasal/scientist.js
scientist.js
A JavaScript interpretation of the Ruby libraryScientist, a library for carefully refactoring critical paths.
How do I science?
Let's pretend you're changing the way you handle permissions in a large web app. Tests can help guide your refactoring, but you really want to capture the current and refactored beahviours under load.
ES6 Sample
import {Experiment, Result} from 'scientist.js'; import Permission from './permission'; import Model from './model'; class MyWidget { constructor() { this.model = new Model(); } allows(user) { var experiment = new Experiment("widget-permissions"); experiment.use(() => this.model.checkUser(user).valid); // old way experiment.try(() => user.can(Permission.Read, this.model)); // new way return experiment.run(); } }
Use use(..) to wrap the existing original behaviour, and use try(..) to wrap the new behaviour. experiment.run(); will always return the result of the use block, but it does a bunch of stuff behind the scenes:
- It decides whether or not to run the try block
- Randomises order to execute try and use blocks
- Measures the duration of both behaviours
- Swallows (but records) any exceptions raised in the try block and
- Set a condition to filter calls to try
Upcoming features (these already exist in the Ruby library):
- Compares the result of try to the result of use ,
- Publishes all this information.
The use block is called the control . The try block is called the candidate .