ããã³ããšã³ãéçºããã»ã¹ãã©ã®ããã«ç·šæããŠãã¿ã¹ã¯èªäœã«çŠç¹ãåœãŠãŠããããã解決ããæ¹æ³ãèããããšãªãã¿ã¹ã¯ã解決ã§ããããã«ããæ¹æ³ã説æããŸãã
ç§ã®ç©èªãè¡šçŽãç Žã£ãããæ¬åœã®å瀺ã«ãªã£ãããããµãã¯ããŸããã Ostrovkaã®éçºè ãèç©ãã倧èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã®çµéšãå ±æããããšæããŸãã
ããŒã ã¯ãŒã¯
ãã¹çªå·
ããã³ããšã³ãã®Ostrovkaã«é¢äžããããŒã ã¯9人ãéçšããŠããŸãã ååãšããŠã2人ã®éçºè ãã³ãŒãã®æžãæ¹ã«ã€ããŠã³ã³ã»ã³ãµã¹ãåŸãããšã¯ç°¡åã§ã¯ãããŸããïŒ ããã«ã¡ã¯ããšã¯ã¹ãã©ããã ;-)ã9ã«ã€ããŠèšããŸãã äžæ¹ããããžã§ã¯ãã®ã¢ãŒããã¯ãã£ãæ確ãã€ç°¡æœã«ãã³ãŒããèªã¿ãããä¿å®ãããããã®ã«ããå¿ èŠããããŸãã æè¿ããŒã ã«å ãã£ãæ°äººããå¥ã®ãããžã§ã¯ãã«åãæ¿ããªããã°ãªããªã人ããã³ãŒããããã«ç解ã§ããããšãéèŠã§ãã
ãããŒãžã£ãŒãšéçºè ã«ã¯ããã¹çªå·ããšããçšèªããããŸãã ããã¯ããããžã§ã¯ãããµããŒãã§ããªããªãããã«ãã¹ã«ã¶ã€ããå¿ èŠãããéçºè ã®æ°ã§ãã ææªã®å Žåããã¹çªå·ã¯1ã§ãã ç§ãã¡ã®ã¿ã¹ã¯ã¯ããã¹çªå·ãæ倧åããããšã§ããçæ³çã«ã¯ãããã¯éçºè ã®æ°ãšçãããªããã°ãªããŸããã
ãã¹ãŠã®éçºè ãåãã¹ã¿ã€ã«ã§ã³ãŒããèšè¿°ãããããžã§ã¯ãã®ãããã®éšåã§è¡ãããŠããªãããšãç¥ã£ãŠããã°ãé«ããã¹æ°ãç°¡åã«éæã§ããŸãã
ã¬ã€ãã©ã€ã³
éçºè ãåãã¹ã¿ã€ã«ã§ã³ãŒããæžãããã®ã¬ã€ãã©ã€ã³ããããŸãã å éšãªãœãŒã¹ã®1ã€ã§ãéçºè ã¯ã³ãŒãã®ãã©ãŒãããã«é¢ããã«ãŒã«ã ãã§ãªãããããžã§ã¯ãã®ãšã³ã·ã¹ãã ã®æ©èœïŒãã¡ã€ã«ã®ä¿åå Žæãšä¿åæ¹æ³ããããžã§ã¯ãã®ç·šææ¹æ³ãã³ãŒããæžãããã®ããã€ãã®ã«ãŒã«ã
ãããžã§ã¯ãã§äœ¿çšãããæãéèŠãªã«ãŒã«ã®1ã€ã¯ãjsDocã䜿çšããã³ãŒãã®å¿ é ããã¥ã¡ã³ãã§ãïŒ http://code.google.com/p/jsdoc-toolkit/ãhttps://developers.google.com/closure/compiler/docs / js-for-compiler ïŒã jsDocã䜿çšãããšå€§ããªå©ç¹ããããŸãã ãŸããã³ãŒãã®å¯èªæ§ãåäžããŸãã 第äºã«ãå€ãã®IDEã§ã¯ãjsDocã䜿çšãããããžã§ã¯ãã§ããã²ãŒãããã®ãéåžžã«äŸ¿å©ã§ãã vimã®ãããªåçŽãªããã¹ããšãã£ã¿ã䜿çšããŠ
ã³ãŒãã¬ãã¥ãŒ
ãã¹çªå·ãå¢ããããã®2çªç®ã®æ¡ä»¶-ãããžã§ã¯ãã®ä»ã®éšåã®ã³ãŒãã®è©³çŽ°ã«é¢ããéçºè ã®ç¥è-ã¯ãOstrovokã§WTFïŒã³ãŒããèŠãŠããªãéçºè ã®æåã®åå¿ïŒãšåŒã°ããã³ãŒãã¬ãã¥ãŒã·ã¹ãã ã䜿çšããŠéæãããŸãã
ç§ãã¡ã®ããŒã ã§ã¯ãã¹ãŠãä¿¡é Œã«åºã¥ããŠæ§ç¯ãããŠãããããããæã€æ®é ·ãªãã¹ã¯ããªãã®ã§ããã¹ãŠã®éçºè ã®ã³ââãŒãããã©ããŒãã人ã¯äžäººãããŸããã ã³ãŒããæçš¿ããåã«ãéçºè èªèº«ãã³ãŒãã®ç¢ºèªã仲éã«äŸé ŒããŸãã 第äžã«ãããã¯æ€æ»å®ãšç£æ»äººã®äž¡æ¹ã®è²¬ä»»ã«è¯ã圱é¿ãäžããŸãã第äºã«ãåéçºè ã¯èªåã®ã³ãŒããç¹°ãè¿ãèŠãŠèªåãå ¬éããèš±å¯ãäžãããããé£äººãäœãã©ã®ããã«è¡ãããç¥ã£ãŠããŸãã
éçºæ©èœ
åäŒæ¥ã®éçºã¢ãããŒãã¯ããããžã§ã¯ãã®ç¹æ§ãšãããžã§ã¯ãã«åãçµãã§ããããŒã ã«åºã¥ããŠæ§ç¯ãããŠããŸãã Ostrovokã§ã¯ãããã³ããšã³ãã«ååãªéç¹ã眮ãããŠããŸãã ãã®ã¢ãããŒãã¯æŽå²çã«çºå±ããŠããŸãããããã«ãå€æ°ã®éçºè ãšé©åã«æ©èœããã·ã¹ãã ããã®ã¢ãããŒããæ¯æããŠããŸãã
ããã³ããšã³ãã®å©ããåããŠãäžèŠéå®åã®å€æ°ã®ã¿ã¹ã¯ã解決ãã匷åãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ã§ããŸãã ããšãã°ãç§ãã¡ã®æ€çŽ¢çµæã¯ãã»ãšãã©ãã¹ãŠã®æ å ±ãã¯ã©ã€ã¢ã³ãåŽã§çºçããããã«æ©èœããŸãã ããã¯ãšã³ãã¯ãå©çšå¯èœãªããã«ã®ãªã¹ããJSONã®åœ¢åŒã§è¡šç€ºãããšããäºå®ã«é¢äžããŠãããããã³ããšã³ãã¯ãããã«ã®äžèŠ§è¡šç€ºãå°å³äžã§ã®ããã«ã®æç»ã䞊ã¹æ¿ãããã£ã«ã¿ãªã³ã°ã«æ¢ã«é¢äžããŠããŸãã
æã®æ°ãéšå±ã®ã³ã¹ããªã©ãæ€çŽ¢çµæã®ãã£ã«ã¿ãŒãå€æŽããŠã¿ãŠãã ãã-ãã¹ãŠã®èšç®ã¯ã¯ã©ã€ã¢ã³ãã§è¡ããããããããã«ã®ãªã¹ãã¯å³åº§ã«æŽæ°ãããŸãã 倧éã®ããŒã¿ãæ±ããšããäºå®ã«ããããããïŒããšãã°ããã³ãã³ã«ã¯2,000ãè¶ ããããã«ããããŸãïŒããµã€ãã¯ãŠãŒã¶ãŒã®èŠæ±ã«éåžžã«è¿ éã«å¿çããŸãã
Javascript
ã¯ã©ã€ã¢ã³ãåŽããã®ããã«éèŠããããã«ã¯ãã³ãŒããæ éã«ç·šæããã³æ§é åããå¿ èŠããããŸãã ã¢ãžã¥ã©ãŒOOPããŒã¹ã®éçºã¢ãããŒããéžæããŸããã ããã¯ãJavaScriptãæäŸããã¯ã©ã¹ãç¶æ¿ã匱ããã€ã³ãã£ã³ã°ãããã³ãã®ä»ã®OOPæ©èœãç©æ¥µçã«äœ¿çšããŠããããšãæå³ããŸãã
åããŒãžã«ã¯ãããã€ãã®ãã¹ããããã¢ãžã¥ãŒã«ãå«ãåå¥ã®JavaScriptã¯ã©ã¹ããããŸãããããã®ã¢ãžã¥ãŒã«ã¯ãç¡éã«ãã©ã°ã¡ã³ãåããããšãã§ããŸãã
åºæ¬ã¢ãžã¥ãŒã«ã¯ã©ã¹ãäœæããŸããã ã€ãã³ãã®æäœã«å ããŠã圌ã¯ã»ãšãã©äœãç¥ããŸããããæçµçã«ã¯ãããŒãžãæ€çŽ¢ãã©ãŒã ã³ã³ãããŒã©ãŒããŸãã¯ã«ã¬ã³ããŒãªã©ãä»ã®ãã¹ãŠã®ã¢ãžã¥ãŒã«ã圌ããç¶æ¿ãããŸãã åããŒãžã«ã¯ããã®ããŒãžã®ã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãåçŽã«äœæãããåæåãè¡ããããšã³ããªãã€ã³ãããããŸãã
ãã®ã¢ãããŒãã説æããããã«ãããªãç²éãªã³ãŒãäŸã瀺ããŸãã ãµãã¹ã¯ãªãã·ã§ã³çšã®é»åã¡ãŒã«å ¥åãã©ãŒã ã®ããããŒãžããããšæ³åããŠãã ããã
ãã®ã³ãŒãã次ã®ããã«æŽçããŸãã
//base.js /** * @fileoverview Sperical code in vacuum for Habrahabr.ru * @author Igor Alexeenko (habrahabr.ru/users/iamo0) */ /** Project namespace */ var ota = {}; /** * Inheritance interface. Uses temporary constructor. * @param {Function} childCtor * @param {Function} parentCtor */ ota.inherit = function(childCtor, parentCtor) { var temporaryCtor = function() {}; temporaryCtor.prototype = parentCtor.prototype; childCtor.prototype = new temporaryCtor; childCtor.prototype.constructor = childCtor; // Link to parent's prototype. childCtor._super = parentCtor.prototype; }; /** * Base module. It's not necessary, to implement full base class in simple * example, so let it just be an empty class, inherited from Object. * @constructor * @extends {Object} */ ota.BaseModule = function() {}; ota.inherit(ota.BaseModule, Object);
//page.js /** * @fileoverview Page controller. * @author Igor Alexeenko (o0@ostrovok.ru) */ /** * @constructor * @extends {ota.BaseModule} */ ota.Page = function() { this._form = new ota.EmailForm; }; ota.inherit(ota.Page, ota.BaseModule);
//searchform.js /** * @fileoverview Email form. * @author Igor Alexeenko (alexeenko.igor@gmail.com) */ /** * @constructor * @extends {ota.BaseModule} */ ota.EmailForm = function() { this._formElement = document.querySelector('.' + ota.EmailForm.CLASS_NAME); this._formElement.addEventListener( 'submit', ota.EmailForm.getEventHandler(this, this._onSubmit) ); }; ota.inherit(ota.EmailForm, ota.BaseModule); /** * Class name, which uses for match DOM-element. * @const * @type {string} */ ota.EmailForm.CLASS_NAME = 'form-element'; /** * Error message, which displays if user, entered wrong email address. * @const * @type {string} */ ota.EmailForm.EMAIL_ERROR_MESSAGE = ( ', , .' ); /** * @const * @type {RegExp} */ ota.EmailForm.EMAIL_REGEXP = ( /^[a-zA-Z0-9-_.+]{1,}@[a-zA-Z0-9-_.]{2,}\.[a-zA-Z]{2,}$/ ); /** * Static method. Returns event handler with certain context. * @param {Object} context * @param {Function} handler * @return {Function} */ ota.EmailForm.getEventHandler = function(context, handler) { return function(event) { handler.call(context, event); }; }; /** * Form submit handler. Alerts an error if email field is empty or its value * is invalid. Otherwise, submits the form. * @param {Event} event * @private */ ota.EmailForm.prototype._onSubmit = function(event) { event.preventDefault(); var formIsValid = this.validateForm(); var emailField = this._formElement.elements[0]; if (!formIsValid) { alert(ota.EmailForm.EMAIL_ERROR_MESSAGE); emailField.focus(); return; } this._formElement.submit(); }; /** * Form validator. Returns true if email field value is valid. * @return {boolean} */ ota.EmailForm.prototype.validateForm = function() { var emailField = this._formElement.elements[0]; var emailValue = emailField.value; return (emailValue !== '' && ota.EmailForm.EMAIL_REGEXP.test(emailValue)); };
ããŠããããæ©èœãããã«ã¯ãHTMLããŒãžã«æ¬¡ã®ã³ãŒããæ¿å ¥ããã ãã§ååã§ãããã¡ãããæåã«å¿ èŠãªãã¹ãŠã®ãã¡ã€ã«ãæ¥ç¶ããŸãã
<script> new ota.Page; </script>
ãã®äŸã§ã¯ã䜿çšããããŒã«ãšã®äŒè©±ãæžããããã§ã¯ãªããæå³çã«ã©ã€ãã©ãªã䜿çšããŠã¢ãããŒãã®æ¬è³ªã瀺ããŸããã§ããã
ãã¡ããããã®ãããªå°ããªã¿ã¹ã¯ã解決ããããã«ãã³ãŒãã¯éåžžã«å€ããªãããšãå€æããŸããããåãããŒãžã«æ€çŽ¢ãã©ãŒã ããããšæ³åããå Žåã ç¡éã¹ã¯ããŒã«ã®ããã«ã®ãªã¹ãã ããŒã¯ãããããã«ã®ããããããããã³ãªã¹ãå ã®ããã«ã«ã«ãŒãœã«ãåããããšããããäžã®ããŒã«ãŒã匷調衚瀺ãããŸãã ç¶æ ã®å€åã«ãããªã¹ããšãããã®äž¡æ¹ãæŽæ°ãããã¯ãã®ããã€ãã®ãã£ã«ã¿ãŒ-ãã®ã¢ãããŒãã¯æ£åœåãããéåžžã«äŸ¿å©ã«ãªããŸãã
ããã«ããã®éçºã¢ãããŒãã«ããããããžã§ã¯ãã³ãŒãã¯æè»ã«ãªããéèŠãªç¶æ³ã«ç°¡åã«é©å¿ã§ããããã«ãªããŸãã ããšãã°ãéçºè ãã¡ã€ã³ããŒãžããã§ã¯ãªããæ€çŽ¢ã¯ãšãªã«ãã£ãŠãµã€ãã«ã¢ã¯ã»ã¹ãããŠãŒã¶ãŒã®çºè¡ããŒãžãã«ã¹ã¿ãã€ãºããã¿ã¹ã¯ã«çŽé¢ããŠããå Žåãã¿ã¹ã¯ã¯åã¯ã©ã¹ã®äœæãšèŠªã¯ã©ã¹ã®ããã€ãã®ã¡ãœããã®ãªãŒããŒã©ã€ãã«å¶éãããŸãã

ã¢ã¹ã¯ã¯ã®ã«ã¹ã¿ãã€ãºãããéåžžã®æ€çŽ¢çµæïŒé«è§£å床ïŒã
ããŒã¯ã¢ãããšã¹ã¿ã€ã«
ãã¡ãããã³ãŒãã®æ éãªç·šæã¯JavaScriptã ãã§ãªããçµçïŒãµãŒããŒãšã¯ã©ã€ã¢ã³ãã®ãã³ãã¬ãŒãããã³CSSïŒã«ãé©çšãããŸãã ã¬ã€ã¢ãŠãã®èŠä»¶ã¯ãJavaScriptã¢ããªã±ãŒã·ã§ã³ã®å Žåãšåãã§ãïŒã¢ãžã¥ãŒã«æ§ãæè»æ§ãã«ã¹ã¿ãã€ãºæ§ãç°¡åãªç¶æ¿ã 幞éãªããšã«ããããã®èŠä»¶ã«é©ãããããªããã確ç«ãããå®èšŒæžã¿ã®ã³ãŒãç·šæã·ã¹ãã ããããŸãã ããã¯BEMïŒ http://ru.bem.info/method/ãhttp://clubs.ya.ru/bem/ ïŒã§ãã
ããŒã¯ã¢ãããšã¹ã¿ã€ã«ã«ã¯ãããã€ãã®æ©èœã¯ãããŸãããBEMææ³ã䜿çšããŸãã ãŸããBEMã¯JavaScriptã·ã¹ãã ã§ã¯ããŸãæ©èœããªããããjsãã¡ã€ã«ãåå¥ã«ä¿åããç¬èªã®é åºã§æŽçããŸãã次ã«ãã·ã³ãã«ã§ã¯ãªãSCSSïŒ http://sass-lang.com/ ïŒã䜿çšããŸãCSS
ã¯ã©ã€ã¢ã³ããã³ãã¬ãŒã
ã»ãšãã©ã®ããžãã¯ã¯JavaScriptã§å®è£ ãããŠãããããã¯ã©ã€ã¢ã³ããã³ãã¬ãŒããç©æ¥µçã«äœ¿çšããŠããŸãã æåã¯ãunderscore.jsã©ã€ãã©ãªãŒïŒ http://underscorejs.org/ ïŒã«çµã¿èŸŒãŸãããã³ãã¬ãŒããšã³ãžã³ã䜿çšããŸãããããããäžäŸ¿ã§ããããšãããã«èªèããŸããã ãŸãããã³ãã¬ãŒããå¥ã®ãã¡ã€ã«ã«ä¿åãããã£ãã次ã«ããã³ãã¬ãŒããJavaScriptã®æååå€æ°ã§ã¯ãªããvimã®ãããªããã¹ããšãã£ã¿ãŒã§ã®ããŒã¯ã¢ããã®äœæãå®è¡ã«äŒŒãŠããããã«ãããã£ãã
ããã«ããŠãŒã¶ãŒã®ãã·ã³ã®ãªãœãŒã¹ãè€éãªæååå€æã§ç¡é§ã«ãªããªãããã«ããããã®ãã³ãã¬ãŒããããªã³ã³ãã€ã«ããŠãããšãããšæããŸããã
ã€ã³ãã©ã¹ãã©ã¯ãã£éšéã¯ããã³ãã¬ãŒããäœæããŠæ¯æŽãè¡ããŸããã JST-JavaScript Templatesãšåä»ããŸããã äž»ãªæ§æã¯underscore.jsããæ®ãããŠããŸãããããã³ãã¬ãŒããjstæ¡åŒµåãæã€å€éšãã¡ã€ã«ã«ä¿åããããããžã§ã¯ãã®ãã«ã段éã§ãèªåçã«JavaScripté¢æ°ã«ã³ã³ãã€ã«ãããããã«äœæãããŸããã ã³ã³ãã€ã«ããããã³ãã¬ãŒãã¯ãéåžžã®jsãã¡ã€ã«ãšããŠãããžã§ã¯ãã«æ¥ç¶ãããŸãã
<!-- path/to/template.jst --> <ul> <% elements.forEach(element, function(el, index) { %> <li><%= element.name %></li> <% }) %> </ul>
ãã³ãã¬ãŒãã«ã¯å¥ã®åå空éãå ¥åããããã³ãã¬ãŒãèå¥åã¯ãããžã§ã¯ãå ã®ãã¹ã§ãã
// some_file.js var template = templateNs['path/to/template.jst']; var list = [ { name: '' }, { name: '' }, { name: '' } ]; var renderedHtml = template.render({ elements: list }); document.body.innerHTML = renderedHtml;
ã¯ã©ã€ã¢ã³ããã³ãã¬ãŒãã®æäœã¯ãçµçã«æºãã人ãšJavaScriptãæžã人ã®äž¡æ¹ã«ãšã£ãŠéåžžã«äŸ¿å©ã«ãªããŸããã
äŸåé¢ä¿ãšãããžã§ã¯ãã®ãã«ã
åJavaScriptã¯ã©ã¹ã«ã¯ç¬èªã®äŸåé¢ä¿ã·ã¹ãã ããããããå¿ èŠãªãã¹ãŠã®ãã¡ã€ã«ãæäœæ¥ã§æ¥ç¶ããããšã¯ã»ãšãã©äžå¯èœã§ãããäœããã®æ¹æ³ã§ã³ãŒããçž®å°ããå¿ èŠããããŸãã ãã®ãããªè€éãªã·ã¹ãã ã§ã¯ãå€æ°ã®ãã¡ã€ã«ãäœæããå¿ èŠããããããå¹æçãªãã«ãã·ã¹ãã ãå¿ èŠã§ãã ãã®ã·ã¹ãã ãäœæããéã«ãã€ã³ãã©ã¹ãã©ã¯ãã£éšéãåã³ç§ãã¡ãå©ããŸããã
ãããžã§ã¯ãããã«ããããµãŒãã¹ã¯mediageneratorãšåŒã°ããéçºè ã®1人ã«ãã£ãŠäœæãããŸããã ãã®ãµãŒãã¹ã¯ãç¹å¥ãªã¿ã°ã®äœ¿çšã«åºã¥ããŠãããžã§ã¯ãå ã®äŸåé¢ä¿ãåéããŸãã
äŸã«æ»ããŸãããã äž»ã«ããŒãžçšã®page.jsãã¡ã€ã«ãbase.jsããã³searchform.jsãã¡ã€ã«ãå«ããã«ã¯ãpage.jså ã«äŸåé¢ä¿ãç»é²ããå¿ èŠããããŸãã ãããã¯ãjsDocã®@requireã¿ã°ã«ç»é²ãããŸãã å¿ èŠãªãã¡ã€ã«ãæ¥ç¶ããã«ã¯ãpage.jsãã¡ã€ã«ã«ãããšãã°@fileoverviewãããã¯ã®ã©ããã«2ã€ã®ã¿ã°ãè¿œå ããã ãã§ååã§ããããšãããããŸãã
/** * @fileoverview Page controller * @author Igor Alexeenko (twitter.com/iamo0) * @require 'base.js' * @require 'searchform.js' */
ããã ãã§ã ãããã°ã¢ãŒãã§ã¯ã2ã€ã®<script>ã¿ã°ãããŒãžã«è¿œå ãããå¿ èŠãªãã¡ã€ã«ãå«ãŸããŸãã ãããŠããããã¯ã·ã§ã³ã¢ãŒãã§ã¯ãã¡ãã£ã¢ãžã§ãã¬ãŒã¿ãŒã¯ããã3ã€ã®ãã¡ã€ã«ãã¹ãŠã1ã€ã«æ¥çããŠããããã¡ã€ã€ã«æž¡ããŸãã ãã¡ããã圌ã¯è€éãªäŸåé¢ä¿ã远跡ããæ¹æ³ãç¥ã£ãŠããã1ã€ã®ãã¡ã€ã«ãäœåºŠãæ·»ä»ããããšã¯ãããŸããã
ããã«ãjst-templatesãšSCSSãã³ã³ãã€ã«ããåçããã£ãã·ã¥ãããããžã§ã¯ããçµã¿ç«ãŠããã¹ãŠã®é»ãäœæ¥ãè¡ãã®ã¯ã¡ãã£ã¢ãžã§ãã¬ãŒã¿ãŒã§ãã ãããã£ãŠãããã³ããšã³ãéçºè ã¯ãæå ã®ã¿ã¹ã¯ã«ã®ã¿éäžã§ããŸãã
ç§ãã¡ã¯äœãããã€ããã§ãã
å€ãããã°ã©ãã³ã°ã®ãžã§ãŒã¯ããããŸããååã«è€éãªCãŸãã¯Fortranããã°ã©ã ã«ã¯ãCommon Lispèšèªã®ååã®ãæ°ããäœæããããäžç¹å®ã®ããã°ããããé ãå®è£ ãå«ãŸããŠããŸãã
ããã³ããšã³ãéçºè ã«ãšã£ãŠããã®ãžã§ãŒã¯ã¯æ¬¡ã®ããã«èšãæããããšãã§ããŸããjQueryãBackboneããŸãã¯Knockout.jsïŒ http://jquery.com/ãhttp://backbonejs.org/ãŸãã¯httpïŒ// knockoutjsã§èšè¿°ãããããªãè€éãªãããžã§ã¯ãã com / ïŒãGoogle Closure ToolsïŒ https://developers.google.com/closure/ ïŒã®ååã®ãæ°ããæžããããã°ã®ããé ãå®è£ ãå«ãŸããŠããŸã ã
å®éãããã§ç§ã話ããããšã¯ãã¹ãŠãã¢ãžã¥ãŒã«æ§ãOOPã¢ãããŒããç¶æ¿ã§ããåºæ¬çãªã¢ãžã¥ãŒã«ã»ããã®ååšãã¹ã¿ã€ã«ã®æäœãããªã³ã³ãã€ã«ããããã³ãã¬ãŒã-ã¯Google Closureãšã³ã·ã¹ãã ã«ãããŸãã Google Closure Library JavaScriptã©ã€ãã©ãªã«å ããŠããã®ã·ã¹ãã ã«ã¯Google Closure Compiler JSãããã¡ã€ã¢ãŒãå«ãŸããŠããŸãã ãµãŒããŒãã³ãã¬ãŒããšã¯ã©ã€ã¢ã³ããã³ãã¬ãŒãã®äž¡æ¹ã«ã³ã³ãã€ã«ãã倧è±ãã³ãã¬ãŒããšã³ãžã³ã ãŸããGoogle Closure Compilerãšçµ±åãããã¹ã¿ã€ã«èšèªã«ãããcssã¯ã©ã¹ã®ååãããçž®å°ã§ããŸãïŒBEMã䜿çšããéçºè ã«ãšã£ãŠã®éã倢ïŒã
ã¯ããŒãžã£ãŒããŒã«ã¯ã2005幎ããGoogleãç¬èªã®ãããžã§ã¯ãåãã«éçºãããã®ã§ãã æåã«ãã©ã€ãã©ãªã¯GMailã¡ãŒã©ãŒã®ããŒãºã«åãããŠäœæããããã®åŸãä»ã®ãã¹ãŠã®Googleãããžã§ã¯ãã¯ããã䜿çšããŠæžãçŽãããŸããã Closure Library JavaScriptã©ã€ãã©ãªã®ã³ãŒãããŒã¹ã ãã§ãçŽ8MBã®éãããããè€éãªãããžã§ã¯ããéçºããããã«å¿ èŠãªãã®ããã¹ãŠå«ãŸããŠããŸãã
ãã®ã©ã€ãã©ãªã«ã¯ãããªãè€éãªã€ã³ãã©ã¹ãã©ã¯ãã£ãšé«ããšã³ããªãããå€ããããŸãã åžå Žã§å ¥æå¯èœãªãœãªã¥ãŒã·ã§ã³ã䜿çšããããšã«æ £ããŠããããã°ã©ããŒãClosureã«åãæ¿ããã®ã¯éåžžã«å°é£ã§ããããã®ã©ã€ãã©ãªã䜿çšãããšãããžã§ã¯ãã®å質ãå€§å¹ ã«åäžããŸãã
ãã®äžçã®ãã¹ãŠã¯ãäœããã®ããŒã·ãã³ã«ãã£ãŠãã§ã«æžãããŠããŸãïŒäžèŠæš¡/倧èŠæš¡ãããžã§ã¯ãã®å€ãã®éçºè ããŒãããéçºãããšãã«çŽé¢ããã¿ã¹ã¯ã®ã»ãšãã©ã¯ãç¡éã®æ°ã®ãµãŒãã¹ãäœæããéçšã§Googleãšã³ãžãã¢ã«ãã£ãŠæ¢ã«è§£æ±ºãããŠããŸãã
ãã®ç§ãOstrovkaã®æ°ããããŒãžã§ã³ã®ãªãªãŒã¹ãæºåãããŠãããçŸåšGoogle Closureã䜿çšããŠéçºãããŠããŸãã æ°ããOstrovkaã®äž»ãªæ©èœã¯ãåäžããŒãžã®ã¢ããªã±ãŒã·ã§ã³ã§ããããšã§ãã ããã¯ãããŒãžéã®ç§»åãã¢ãã¬ã¹ããŒã®æäœãããŒã¿ã®èªã¿èŸŒã¿ãããŒãžã®ã¬ã³ããªã³ã°ã®ãã¹ãŠã®ããžãã¯ãã¯ã©ã€ã¢ã³ãåŽã«ç§»åããããšãæå³ããŸãã ãããžã§ã¯ãéçºã®è€éãã¯ããµã€ãã®é床ãšãã䟿å©ãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠçžæ®ºãããŸãã
ãã¡ãããGoogle Closureãžã®ç§»è¡ã«äŒŽããéçºãžã®ã¢ãããŒããå€æŽããå¿ èŠããããŸãããããšãã°ããã®æ¹æ³è«ã®ããã€ãã®æ¬ ç¹ãšGoogle Closureãããžã§ã¯ãã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®åŒ±ãäºææ§ã®ããã«BEMãæŸæ£ããªããã°ãªããŸããã§ãããã建èšã«é¢ããèŠè§£ãããžã§ã¯ãã¯åããŸãŸã§ãã