新普金娱乐网址


老妈,生日欢娱

数学西哲史10:原子论者

[C++ Calculator 项目] 初试

  • 三月 10, 2019
  • 数学
  • 没有评论

Calculator V1.0

总结

下面容易介绍了幂等性的概念,用幂等设计取代分布式事务的点子,以及HTTP主要方法的语义和幂等性特征。其实,如若要追根溯源,幂等性是数学中的叁个定义,表明的是N次变换与三回变换的结果同样,有趣味的读者能够从Wikipedia上越发询问。

代码编写进度碰到的难点:

  这一次的难题不是很难,尤其是后来标题一向在改简单,所以代码写得也正如流利。
  然而原先编写Print类时,根本不知晓queue是如何数据类型,于是就去百度了许多,不敢说都懂了,然则至少会用了。
  除了部分边边角角的题材外,在率先次编写完toStringQueue方法后跻身了疯狂的调节和测试情况,bug不停的出现,原始代码如下

图片 1

  当时的想法是逐字符提取,

  •  若是字符则直接push(temp)
  •  假如数字temp+=c[i++],把数字接到temp上

    •  再判断下一个c[i] 是或不是也是数字

      • 是,就把下1个收受temp前边,dlen++
      • 否,就push(temp),重置temp和dlen

自身的IDE是vs二零一零,编写翻译过了,可是运转的时候会弹出警告“ string subscript
out of range

string
下标越界,一开头百度并没懂是那意味,一向在找是或不是上下一心何地的指针也许哪些的没初叶化也许哪个地方进入了死循环

图片 2

新兴在DEBUG格局下才找到罪魁祸首,上边这一个讲话中,当i非常的大于len后先后向下运作

图片 3

只是运维到箭头处时,此时的c[i]早已超越下标范围了,之后又一回i++了,

同时在下边那步的大循环条件中的dlen++<=10有错,这使得数值最大可达10位

图片 4

先是次写的这一个函数的逻辑有点乱,把上面装有bug总计了三次后,发轫大换血,重新写了叁个逻辑稍清晰的,正确运维。


HTTP的幂等性

HTTP协议本身是一种面向财富的应用层协议,但对HTTP协议的选拔实际上存在着二种差别的点子:一种是RESTful的,它把HTTP当成应用
层协议,相比忠实地遵从了HTTP协议的各个规定;另一种是SOA的,它并不曾完全把HTTP当成应用层协议,而是把HTTP协议作为了传输层协议,然后
在HTTP之上建立了和谐的应用层协议。本文所切磋的HTTP幂等性主要针对RESTful风格的,可是正如上一节所观看的那样,幂等性并不属于特定的协
议,它是分布式系统的一种特色;所以,不论是SOA依然RESTful的Web
API设计都应该考虑幂等性。上面将介绍HTTP
GET、DELETE、PUT、POST两种重点格局的语义和幂等性。

HTTP GET方法用于获取财富,不应当副成效,所以是幂等的。比如:GET
http://www.bank.com/account/123456,不会改变资源的状态,不论调用一次还是N次都没有副作用。请注意,这里强调的是
3遍和N次具有同样的副功用,而不是每便GET的结果同样。GET
http://www.news.com/latest-news这个HTTP请求可能会每次得到不同的结果,但它本身并没有产生任何副作用,因而是满足
幂等性的。

HTTP DELETE方法用于删除财富,有副成效,但它应有满意幂等性。比如:DELETE
http://www.forum.com/article/4231,调用一次和N次对系统产生的副作用是相同的,即删掉id为4231的帖子;因此,
调用者能够屡屡调用或刷新页面而毋庸顾虑引起错误。

正如易于混淆的是HTTP
POST和PUT。POST和PUT的差距简单被归纳地误认为“POST表示创设能源,PUT表示更新能源”;而实际上,二者均可用于成立财富,更为本质的分歧是在幂等性方面。在HTTP规范中对POST和PUT是如此定义的:

The POST method is used to request that the origin server accept the
entity enclosed in the request as a new subordinate of the resource
identified by the Request-URI in the Request-Line …… If a resource
has been created on the origin server, the response SHOULD be 201
(Created) and contain an entity which describes the status of the
request and refers to the new resource, and a Location header.

The PUT method requests that the enclosed entity be stored under the
supplied Request-URI. If the Request-URI refers to an already existing
resource, the enclosed entity SHOULD be considered as a modified
version of the one residing on the origin server. If the Request-URI
does not point to an existing resource, and that URI is capable of
being defined as a new resource by the requesting user agent, the
origin server can create the resource with that URI.

POST所对应的UKugaI并非创制的能源自己,而是能源的收信人。比如:POST
http://www.forum.com/articles的语义是在http://www.forum.com/articles下创建一篇帖
子,HTTP响应中应涵盖帖子的创建状态以及帖子的U安德拉I。四次相同的POST请求会在服务器端创建两份财富,它们拥有分化的U帕杰罗I;所以,POST方法
不具有幂等性。而PUT所对应的ULacrosseI是要成立或更新的财富本人。比如:PUT
http://www.forum/articles/4231的语义是创建或更新ID为4231的帖子。对同一URI进行多次PUT的副作用和一次
PUT是一样的;由此,PUT方法具有幂等性。

在介绍了两种操作的语义和幂等性之后,大家来看望哪些通过Web
API的款型达成前边所涉及的取款功效。相当粗略,用POST
/tickets来兑现create_ticket;用PUT
/accounts/account_id/ticket_id&amount=xxx来实现idempotent_withdraw。值得注意
的是从严来讲amount参数不应该作为U奥迪Q5I的一有个别,真正的U昂科雷I应该是/accounts/account_id/ticket_id,而
amount应该置身请求的body中。那种方式能够采纳于广大场合,比如:论坛网站中预防意外的再次发帖。

落到实处代码如下:
  • scan.h

    #ifndef _SCAN_H_
    #define _SCAN_H_
    #include<string>
    #include<iostream>
    #include<queue>
    using std::string;
    using std::queue;
    class Scan{
    queue<string> expression;    //用于接收表达式
    bool isDigit(char c);       //判断是否是数字或'.'
    void numErr();              //当数值超过10位后报错
    public:
    Scan(){};                        //    ->暂无
    ~Scan(){};                       //    ->暂无
    queue<string> getExp(){return expression;}  //返回expression队列的内容
    queue<string> toStringQueue(string );  //toStringQueue将string的内容逐字符提取转换为string队列
    }; 
    #endif
    
  • print.h

    #ifndef _PRINT_H_
    #define _PRINT_H_
    #include<iostream>
    #include<string>
    #include<queue>
    using namespace std;
    class Print{
    // parameter 
    public:
    Print(){};    //暂无
    ~Print(){};     //暂无
    bool putq(queue<string> output); //逐行输出string队列
    };
    #endif
    
  • Calculator.cpp

    #include<iostream>
    #include<string>
    #include"scan.h"
    #include"print.h"
    int main()
    {
        using namespace std;
        string exp;         //exp用来接收键盘输入的表达式
        getline(cin,exp);
        Scan input;
        Print output;
        output.putq( input.toStringQueue(exp)); //调用input类的toStringQueue方法,返回一个<string>的队列,传入output的putq方法输出队列
        cin.get();  
        return 0;
    }
    
  • scan.cpp

    #include"scan.h"
    bool Scan::isDigit(char c)                                      //判断是否是数字或句点
    {
        if( (c<='9'&&c>='0')|| c=='.')return true;
    
        return false;
    }
    
    void Scan::numErr()
    {
        std::cout<<"numerical ERROR\n";
        std::cin.get();
        std::exit(-1);
    }
    
    queue<string> Scan::toStringQueue(string input)
    {
        int i=0,dlen=0;         //i用于循环,dlen用于表示数值长度
        int len=input.length(); //用input的长度len来作为循环条件
        string& c=input;    //用c来代替input不然打的太累了=。=
        string temp="";     //temp用来暂储input中的元素
        while( i<len){
            if(isDigit(c[i]) ){
                temp+=c[i];
                dlen++;
                if(dlen>10)numErr();        //判断数值是否超出范围
                if( (i+1)<len && isDigit(c[i+1]) && ++i ) continue; //判断是否还有下一个字符以及下一个字符是不是数字或句点,若是++i跳回循环开头,
                                            //    否则,将条件后的数个语句执行
            }
            else temp=c[i];
            dlen=0;                             /重置dlen
            expression.push(temp);          //将temp推入队列
            temp="";
            i++;
        }
        return expression;
    }
    
  • print.cpp

        #include"print.h"
        bool Print::putq(queue<string> output)
        {
            int count=0;     //count计数确保输出正确
            while( !output.empty() ){
                cout<<output.front()<<endl;
                output.pop();
                count++;
            }
            return count==output.size();  //返回输出个数是否正确的布尔值
        }
    

    源文件能够在github上下载


据他们说HTTP协议的Web
API是眼前最为流行的一种分布式服务提供方式。无论是在巨型网络使用照旧集团级架构中,大家都来看了一发多的SOA或RESTful的Web
API。为啥Web
API如此流行呢?小编觉着相当的大程度上应归功于不难实用的HTTP协议。HTTP协议是一种分布式的面向财富的网络应用层协议,无论是服务器端提供Web服
务,依然客户端消费Web服务都卓殊简单。再增加浏览器、Javascript、AJAX、JSON以及HTML5等技能和工具的向上,互连网选取架构划设想计表现出了从观念的PHP、JSP、ASP.NET等服务器端动态网页向Web API +
牧马人IA(富互连网应用)过渡的矛头。Web
API专注于提供工作服务,PAJEROIA专注于用户界面和交互设计,从此四个领域的分工特别明显。在这种势头下,Web
API设计将改为服务器端程序员的必修课。可是,正如简单的Java语言并不表示高品质的Java程序,不难的HTTP协议也不代表高品质的Web
API。要想设计出高品质的Web
API,还索要深刻了然分布式系统及HTTP协议的风味。

注:那是三个C++计算器项目标起头部分。

分布式事务 vs 幂等设计

为啥供给幂等性呢?我们先从二个例证说起,固然有二个从账户取钱的长途API(能够是HTTP的,也得以不是),大家一时半刻用类函数的点子记为:

bool withdraw(account_id, amount)

withdraw的语义是从account_id对应的账户中扣除amount数额的钱;假若扣除成功则赶回true,账户余额缩小amount;
如若扣除退步则赶回false,账户余额不变。值得注意的是:和当地环境相比较,我们不可能随便要是分布式环境的可相信性。一种典型的情形是withdraw请
求已经被劳动器端正确处理,但劳动器端的回来结果由于网络等原因被掉丢了,导致客户端不可能得知处理结果。假设是在网页上,一些不合适的安排性可能会使用户认
为上二回操作失败了,然后刷新页面,那就导致了withdraw被调用四次,账户也被多扣了三遍钱。如图1所示:

图片 5

图1

本条标题标缓解方案一是采用分布式事务,通过引入扶助分布式事务的中间件来保险withdraw功能的事务性。分布式事务的亮点是对于调用者很简单,复杂性都交由了中间件来治本。缺点则是三只架构太重量级,不难被绑在特定的中间件上,不便宜异构系统的合龙;另一方面分布式事务就算能担保工作的
ACID性质,而但却一筹莫展提供品质和可用性的担保。

另一种更轻量级的缓解方案是幂等设计。大家能够通过有个别技术把withdraw变成幂等的,比如:

int create_ticket() 
bool idempotent_withdraw(ticket_id, account_id, amount)

create_ticket的语义是获取一个劳务器端生成的绝无仅有的处理号ticket_id,它将用于标识后续的操作。
idempotent_withdraw和withdraw的界别在于涉及了1个ticket_id,一个ticket_id表示的操作至五只会被拍卖贰次,每回调用都将回到第一遍调用时的处理结果。那样,idempotent_withdraw就符合幂等性了,客户端就足以放心地反复调用。

依据幂等性的化解方案中二个完完全全的取钱流程被分解成了八个步骤:1.调用create_ticket()获取ticket_id;2.调用
idempotent_withdraw(ticket_id, account_id,
amount)。虽然create_ticket不是幂等的,但在那种布置下,它对系统状态的影响能够忽略,加上idempotent_withdraw
是幂等的,所以任何一步由于互联网等原因战败或逾期,客户端都得以重试,直到得到结果。如图2所示:

图片 6

图2

和分布式事务比较,幂等安插的优势在于它的轻量级,不难适应异构环境,以及品质和可用性方面。在好几品质要求比较高的选用,幂等设计反复是唯一的挑三拣四。

作为学士活的第二个C++项目,肯定有众多不足之处,欢迎看过的诸位给本身批评与建议,多谢!

幂等性定义

本文所要研究的就是HTTP协议提到到的一种主要性质:幂等性(Idempotence)。在HTTP/1.1行业内部中幂等性的概念是:

Methods can also have the property of “idempotence” in that (aside
from error or expiration issues) the side-effects of N > 0
identical requests is the same as for a single request.

从概念上看,HTTP方法的幂等性是指三遍和高频伸手某三个财富应该有所相同的副作用。幂等性属于语义范畴,正如编译器只好救助检查语法错误一
样,HTTP规范也从不办法通过消息格式等语法手段来定义它,那大概是它不太受到好感的来由之一。但其实,幂等性是分布式系统设计中国和欧洲常关键的定义,而
HTTP的分布式本质也控制了它在HTTP中装有首要地点。

因为四个一点都不小心,花费了友好一早晨时光来debug,大致血与泪的代价啊,事实告诉要好随后写程序仍旧要多想一会,否则大把大把的年月就像此没了,同时也劝告本身之后要多珍视程序的逻辑,那样才能写出更健康的代码来。

大致功用简介:
  • 能够输入一串数学表明式
  • 逐字符扫描,提取数字和标记获得一组成代表队列
  • 逐行输出提取的记号与数字

最后……当然是计算啦:

相关文章

No Comments, Be The First!
近期评论
    分类目录
    功能
    网站地图xml地图