2010-12-15 15 views
14

Właśnie uruchamiam nową aplikację internetową i chcę zaimplementować pewną formę sprawdzania poprawności stylu umowy w moim JavaScript. Zrobiłem kilka szybkich google i natknąłem się na JsContact, ale składnia nie jest dokładnie tym, co miałem na myśli. Czy ktoś jest świadomy innych bibliotek?Biblioteki kontraktu kodu JavaScript?

myślę Chcę składnia być coś

String.prototype.padLeft = function(c, width) { 
    Verify.value(c).isRequired().isNotNull().isChar(); 
    Verify.value(width).isRequired().isNotNull().isNumber().greaterThan(0); 

    ... 

    Verify.value(result).isNotNull(); 

    return result; 
}; 

Mimo to nie potrwa długo, aby ułożyła własną bibliotekę, która ma składni/metody chcę, jeśli ktoś już zrobił praca jest wystarczająco blisko, zaoszczędzi mi to trochę czasu. Z góry dziękuję.

UPDATE

nie będę miał czasu na pracę w tej sprawie aż do tego popołudnia, więc dam mu jeszcze kilka godzin, aby sprawdzić, czy ktoś ma jakieś zalecenia. Jeśli nie, opublikuję to, co stworzyłem gdzieś jako odpowiedź poniżej, aby inni ludzie mogli się z nimi zapoznać, jeśli tego chcą.

Mam również podano trochę więcej myśli do API, które ma sensu, a ja jestem obecnie na myśli coś podobnego (contrived przykłady):

function searchUser(firstName, middleInit, lastName) { 
    Verify.value(firstName).isString().matching(/\w+/);  // Must have value 
    Verify.value(middleInit).whenNotNull().isChar();   // May be null, but not undefined 
    Verify.value(lastName).isString().withMinimumLengthOf(2); // Must have value 

    ... 
} 

function syncTime(serverTime, now) { 
    Verify.value(serverTime).isDate();   // Must have value. 
    Verify.value(now).whenDefined().isDate(); // May be undefined, but not null. 

} 

Moja obecna myśl, że tolerowanie wartości NULL lub niezdefiniowanej nietypowy (przynajmniej dla mnie?) jako taki, zamiast jawnie określać, że wartość .isNotNull() rzeczywiście wyłączyć regułę dla .whenDefined() lub .whenNotNull(), jak pokazano powyżej. Mogę uczynić .whenNotNull() nie błąd na UNDEFINED, ale widzę NULL vs UNDEFINED jako ważne rozróżnienie; zobaczymy ... wszystkie inne metody będą dość typowe ... myśli? komentarze?

Odpowiedz

5

Biorąc pod uwagę, że nikt nie polecił żadnych istniejących bibliotek, lub że jestem szalony, sądząc, że to dobry pomysł, poszłam do przodu i zrzuciłam podstawową bibliotekę. Kod nie jest fantazyjny, ale robi to, co chcę, i jest dość szybki do uruchomienia (ok. 40 połączonych kontroli na ms w IE).

zdecydowałem się na końcowym składni jak:

function syncTime(serverTime, now) { 
    Verify.value(serverTime).always().isDate(); // Cannot be undefined or null. 
    Verify.value(now).whenDefined().isDate();  // Cannot be null, but must be date when defined. 

    //Code 
} 

function searchForUser(firstName, middleInit, lastName) { 
    Verify.value(firstName).always().isString().withMinimumLengthOf(2); // Cannot be undefined or null. 
    Verify.value(lastName).always().isString().withMinimumLengthOf(2); // Cannot be undefined or null. 
    Verify.value(middleInit).whenNotNull().isChar().between('A', 'Z'); // Cannot be undefined, but must be single char string when not null. 

    //Code 
} 

Zdecydowałem się wyraźne „Must Have Value” poprzez .always() sprawdzić, osobiście uważam, że to ładniejszy czytać; ale widziałem, że niektórzy idą inną drogą.

Biorąc pod uwagę, że źródło jest bardziej niż chcę zamieścić w tej odpowiedzi, proszę udać się do tego CodePlex Wiki Page, jeśli jesteś zainteresowany źródłem. Przypuszczam, że zwrócił się do bardziej płynnej biblioteki asercji; ale robi to, czego potrzebuję.

Aktualizacja

I aktualizowane źródło na powiązanej stronie CodePlex powyżej. W szczególności zrestrukturyzowałem klasę Verify, aby korzystać z "kontekstu wartości", zamiast zawsze budować nowe obiekty weryfikatora; poprawiono wydajność IE (nigdy nie było problemu z FireFox lub Chrome) ... teraz obsługuje około 100 połączonych kontroli na ms w IE.

+0

Awesome idea! Aby uprościć kod, możesz pomyśleć o korzystaniu z biblioteki takiej jak Underscore do sprawdzania typu/wartości. Te metody są już dość szybkie i możesz skupić się bardziej na Verify API. http://documentcloud.github.com/underscore/ – strongriley

+0

Brak prob! Czy masz repo na GitHub czy coś takiego? Byłby zainteresowany rozwidleniem/pomocą. Aby jeszcze bardziej obniżyć wydajność, być może można ustawić program w trybie prod lub debugowania. W trybie prod nie działał. – strongriley

+0

@strongriley Obecnie mam je tylko na wspomnianej stronie wiki CodePlex. Mogę rzucić to na GitHub (https://github.com/cbaxter), gdy czas na to pozwala; Wdrożenie może zdecydowanie zostać trochę oczyszczone. –

0

Też rzuciłem razem mój pomysł umów typu, który robi to, co chcę. Myślę, że trochę późno, ale polecam to osobom, które chcą na to spojrzeć: https://github.com/lindem/FirstContract

To jest WIP, ale potrzebowałem czegoś podobnego.

function bmi (weight, height) { 
    return weight/height * height; 
} 

var c = require("firstcontract").c 
    /* 
    * contract applies to function taking two non-negative numbers, 
    * returning a negative number: 
    */ 
    , contract = c(["R+0", "R+0"], "R+0") 
    , cbmi = contract(bmi) 
    ; 

Został stworzony w taki sposób, że można go dodawać i usuwać bez zmiany funkcji monitorowanej i zapewnia tylko zacisk wokół funkcji. To jest commonjs i na npm.

0

Jeden więcej - https://www.npmjs.com/package/bycontract Jest to mała biblioteka, która oczekuje wyrażeń JSDoc (http://usejsdoc.org/) dla umowy. Szansa dla Ciebie jest już dobrze znana w składni.

Wystarczy zobaczyć go w akcji:

// Simple test 
byContract(true, "boolean"); // ok 
// Multiple Types 
byContract(100, "string|number|boolean"); // ok 
// Optional Parameters 
function foo(bar, baz) { 
    byContract(arguments, [ "number=", "string=" ]); 
} 

Tutaj kinda przykład w świecie rzeczywistym:

/** 
* @param {number|string} sum 
* @param {Object.<string, string>} payload 
* @param {function} cb 
* @returns {HTMLElement} 
*/ 
function foo(sum, payload, cb) { 
    // Test if the contract is respected at entry point 
    byContract(arguments, [ "number|string", "Object.<string, string>", "function" ]); 
    // .. 
    var res = document.createElement("div"); 
    // Test if the contract is respected at exit point 
    return byContract(res, HTMLElement); 
} 
// Test it 
foo(100, { foo: "foo" }, function(){}); // ok 
foo(100, { foo: 100 }, function(){}); // exception - ByContractError: Value of index 1 violates the contract `Object.<string, string>` 
1

mogę zasugerować wam następny kod kontrakty bibliotekę: dbc-code-kontrakty.


NPM: https://www.npmjs.com/package/dbc-code-contracts

GitLab repo (home): https://gitlab.com/o.oleg/orbios.dbc#README

CI buduje się z jednostek testów: Kod https://gitlab.com/o.oleg/orbios.dbc/-/jobs/


Próbka:

Dbc.Contract.throwException = true; 

const domId = "my-div"; 
const div = document.createElement("div"); 
div.id . = domId; 
document.body.appendChild(div); 

const state = Dbc.Dom.removeById(domId); 
Dbc.Contract.isTrue(state); 
Dbc.Contract.isNull(document.getElementById(domId)); 

następujące zamówienia są obsługiwane (02 listopada 2017)

  1. isfunction
  2. isObject
  3. isSymbol
  4. isBoolean
  5. isTrue
  6. isFalse
  7. isString
  8. isEmptyString
  9. isNotEmptyString
  10. areStringsEqual
  11. ISNUMBER
  12. isNumberLess
  13. isNumberBigger
  14. areNumbersEqual
  15. isValueNaN
  16. isDefined
  17. isUndefined
  18. ISNULL
  19. isArray
  20. isEmptyArray
  21. isNotEmptyArray
  22. isObjectImmutable
  23. isPromise
  24. isPrototypeOf

Ponadto, istnieją wewnętrzne kontrole umowne, wewnątrz metod DOM z tej biblioteki.