Closed ioseb closed 11 years ago
@vaxop ამ დავალებით მინდა გააგრძელო, კიდევ თუ აპირებ მუშაობას დღეს შეგვიძლია განვიხილოთ.
ki vapireb dges ravi gvianobamde chavujdebi .... exla shevxedav ra aris am davalebis shinaarsi da tu kitxva damebada shegekitxebi @ioseb .
@vaxop შესანიშნავია! მოკლედ პატარა დეტალებს მოგაწვდი:
HttpRequest
ინტერფეისის დანიშნულება მდგომარეობს ერთი ზოგადი ინტერფეისის არსებობის მხარდაჭერაში. დროდადრო შეიძლება რეალიზაციები ვცვალოთ, მაგრამ აპლიკაციის დანარჩენმა ნაწილმა უნდა გამოიყენოს მხოლოდ ეს ინტერფეისი.HttpRequestWrapper
კლასი უნდა იყოს ამ ინტერფეისის საწყისი რეალიზაცია.HttpRequest
ინტერფეისს აკლია რაღაცეები და დავამატებ რომ უკეთესი წარმოდგენა შეგექმნას.ზოგადი დანიშნულება მდგომარეობს იმაში რომ როდესაც სერვერი დაასრულებს მოთხოვნის დამუშავებას ანუ:
უნდა მოხდეს ამ ინფორმაციის განთავსება HttpRequest
ტიპის ობიექტში ერთხელ რომელიც მოგვიანებით გადაეცემა აპლიკაციის დანარჩენ ნაწილს.
მოდიფიცირებული HttpRequest
ინტერფეისი:
package edu.cst.webserver.http;
import java.util.Map;
public interface HttpRequest {
/**
* Returns HTTP request method name POST, GET etc...
*/
public HttpMethod.Type getRequestMethod();
/**
* Returns parsed HTTP Request Line object
*/
public HttpRequestLine getHttpRequestLine();
/**
* Returns request URI in a full form,
* /path/to/resource?param=value
* MUST use requestLine object
*/
public String getRequestURI();
/**
* Returns HTTP version string: HTTP/1.1
* MUST use requestLine object
*/
public String getHttpVersion();
/**
* Returns key/value pairs of parsed HTTP request header fields
*/
public Map<String, String> getAllHeaders();
/**
* Returns value of a HTTP header field
* @param headerName
*/
public String getHeader(String headerName);
/**
* Returns request content type specified as a value of
* Content-Type: header field. e.g. application/x-form-www-urlencoded
*/
public String getContentType();
/**
* Returns key/value pairs of query string or submitted form
* MUST use requestLine
* retrieve query string from requestLine object
* perform lazy parsing of query string
*/
public Map<String, String> getParams();
/**
* Returns path portion of request URI. If request URI was
* /path/to/resource?param1=value1¶m2=value2
* method returns /path/to/resource
* MUST use requestLine object
*/
public String getPath();
}
@vaxop მგონი რაღაცა იკითხე Map
- ის შესახებ?
@ioseb gavarkvie cota odeni ram
@vaxop ყოველი შემთხვევისთვის გადაიკითხე: http://docs.oracle.com/javase/7/docs/api/java/util/Map.html აუცილებელია რომ კარგად გესმოდეს.
@ioseb ki cavikitxav
შედეგის მაგვარს როდის ველოდოთ?
On Tuesday, March 5, 2013 at 10:38 PM, Vaxtang Pataraia wrote:
@ioseb (https://github.com/ioseb) ki cavikitxav
— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/14#issuecomment-14457028).
ravici cota gaurkvevlobashi var da amat kodebs vkitxulob exla da verkvevi ragaceebshi
მოიწერე რამე თუ არ გესმის დაგაკვალიანებ :-)
On Tuesday, March 5, 2013 at 10:42 PM, Vaxtang Pataraia wrote:
ravici cota gaurkvevlobashi var da amat kodebs vkitxulob exla da verkvevi ragaceebshi
— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/14#issuecomment-14457265).
kargit
@vaxop ეჭვი მაქვს რომ გაურკვევლობაში ხარ, არ გინდა მოგეხმარო(თ)? შეკითხვები არ გაქვს?
@ioseb zalian merideba magram ver davzari garda imisa rom gavakete HttpRequest interface da HttpRequestWrapper klasshi implements gavukete da chakara kodebi exla var udides sttresshi ver mivxvdi sad raunda chavcero:((
@vaxop
@ioseb არ ვიცი HttpRequest -შიც უნდა ჩავწერო რამე თუ არა და ასევე HttpRequestWrapper კლასში რა კოდით შევავსო:( ან როგორ დავიწყო რას გადავხედო და ა.შ. სამწუხაროდ იმასაც ვერ ვფიქრობ კითხვა როგორ და რაზე დამესვა:(
კი ვიმუშავებ თქვენ თუ არ შეგაწუხებთ
@vaxop ვხვდები რაშიც არის პრობლემა. მოკლედ ასე დავიწყოთ და მომყევი ნაბიჯ-ნაბიჯ, თუ რამეს ვერ გაიგებ შეკითხვა შემომიბრუნე:
დამიმოწმე თუ ეს დეტალები გესმის.
P.S. არა, არ შემაწუხებ :-)
მეთოდის აღწერა ამას გულისხმობს მაგალითად? : public HttpMethod.Type getRequestMethod();
@vaxop ზუსტად. მეტს არაფერს არ გულისხმობს. და რამდენადაც მეთოდი(ან ფუნქცია) თავსისი არსითა და დანიშნულებით აღწერს გარკვეულ ქმედებას. მაგ. getRequestMethod()
შეგვიძლია ვთარგმნოთ ქართულად როგორც მომეცი მოთხოვნის მეთოდი
, არის ცალსახა ქმედება იმიტომ რომ ობიექტს გააჩნია HTTP მოთხოვნის მეთოდის დაბრუნების უნარი.
ამას თუ ჩაეძიები აღმოაჩენ, რომ ჩვენ განვსაზღვრეთ ის თუ რისი(!) გაკეთება შეუძლია ობიექტს. მაგრამ ამითი არ განვსაზღვრავთ იმას თუ როგორ იმუშავებს ეს მეთოდი. მაგალითად მე თუ ვიქნები მაგ ობიექტის მომხმარებელი და მჭირდება HTTP მეთოდი, უბრალოდ საკმარისია ვიცოდე:
ხვდები?
@vaxop ძალიან ბევრი რომ არ "ვიბუქსავოთ" მოდი ახლა უცბად გააკეთე ასეთი რამ:
გააკეთე ინტერფეისი და მისი რეალიზაცია(რაიმე ახალ სუფთა პროექტში):
public interface HttpRequest {
public int getStatusCode();
}
public class HttpRequestWrapper implements HttpRequest {
@Override
public int getStatusCode() {
return 200;
}
}
და ამის მერე დაწერე ასეთი სატესტო კლასი:
class Test {
public static void acceptRequest(HttpRequest request) {
int statusCode = request.getStatusCode();
System.out.println(statusCode);
}
public static void main(String[] args) {
HttpRequest request = new HttpRequestWrapper();
acceptRequest(request);
}
}
ამას როგორც კი გააკეთებ მოიწერე მაშინათვე შევეცადოთ გავაანალიზოთ. ყურადღება მიაქციე ამ მეთოდს acceptRequest(HttpRequest request)
ამ მეთოდმა უბრალოდ იცის რომ ვინც მას გამოიძახებს უნდა გადასცეს HttpRequest
ტიპის ობიექტი რადგან მან იცის მისი ქმედებების შესახებ და არის დაინტერესებული მხარე. თუმცა მეორეს მხრივ წარმოდგენა არ გააჩნია კონკრეტულად რომელი რეალიზაცია გადაეცემა.
ტესტ კლასს რა დავარქვა? HttpRequestWrapperTest?
@vaxop თუნდაც AnzorErkomaishvili
მაგრამ ეგ სახელი რაც დადე კარგია :-)
@vaxop პაკეტების მითითება არ დაგავიწყდეს, გააკეთე რამე პაკეთი და იმ პაკეტში შექმენი კლასები(ანუ მარჯვენა ღილაკით კლიკი პაკეთის სახელზე -> new class)
:))) კი ვაკთებ ეგრე
გავაკეთე ყველაფერი რაც მითხარი
წერილი მომივიდა არ მაკეთებინებს მაგ სახელით კლასსო და აქ არ ჩანს ეგ მესიჯი, გამოდის თუ არა? ბოლო ბოლო სხვა სახელი დაარქვი ვერ ვხვდები რატომ არ გაქმნევინებს და რას გეუბნებ ზოგადად?
@vaxop თუ გააკეთე ყველაფერი მაშინ გაუშვი ეგ შენი სატესტო კლასი(მარჯვენა ღილაკი Run...) და შეხედე შედეგს. და შეეცადე გაანალიზო რა ხდება.
კი დავარქვი რაღაც გაჭედილი ქონდა ინტელიჯეას... გავუშვი და დამიბრუნა 200 ნუ კველაფერი კარგად გაკეთდა
@vaxop რაც მთავარია იმას თუ ხვდები რა ხდება და რატომ მუშაობს ეგ კოდი?
კიი მივხვდი ყველაფერს რაც მანდ ხდება
შესანიშნავი, ახლა ცოტა დავამძიმოთ ამოცანა და ვთქვათ ასეთი რამ:
ახლა ჩვენი ამოცანაა ეგ 200 გადავაგდოთ და მაგის ნაცვლად ვასწავლოთ რომ მაგ სტატუსის კოდის მნიშვნელობა ვიღაცამ მისცეს გარედან და დააბრუნოს რაიმე ცვლადის მნიშვნელობა ნაცვლად მაგ სტატიკურად გაწერილი 200 - ისა.
მოდიფიცირებული ვერსია:
public interface HttpRequest {
public int getStatusCode();
}
public class HttpRequestWrapper implements HttpRequest {
private int statusCode;
@Override
public int getStatusCode() {
return this.statusCode;
}
public void setStatusCode(int statusCode) {
this.statusCode = statusCode;
}
}
მოდიფიცირებული სატესტო კლასი:
class HttpRequestWrapperTest {
public static void acceptRequest(HttpRequest request) {
int statusCode = request.getStatusCode();
System.out.println(statusCode);
}
public static void main(String[] args) {
HttpRequestWrapper request = new HttpRequestWrapper();
request.setStatusCode(404);
acceptRequest(request);
request.setStatusCode(300);
acceptRequest(request);
request.setStatusCode(200);
acceptRequest(request);
}
}
შეეცადე გააკეთო ეს ყველაფერი და მითხრა თუ ხვდები რა ხდება?
ამ ყველაფერს რომ მორჩები შეეცადე acceptRequest მეთოდში შეიტანო ასეთი ცვლილება:
public static void acceptRequest(HttpRequest request) {
int statusCode = request.getStatusCode();
System.out.println(statusCode);
request.setStatusCode(700);
System.out.println(statusCode);
}
და გააცნობიერო რას იწვევს ეს ცვლილება და რატომ ხდება ის რაც ხდება და როგორც ხდება.
@vaxop რა ხდება აბა?
@vaxop არ მითხრა ახლა ბრძოლის ველზე დავეციო :S
არა არ დავცემულვარ ვარჩევ 10 წუთი დამაკავგვინა შეყვარებულთან ბრძოლამ ბოდიში დიდი პერესტრელკა იყო... გავაკეთე ესე და ეხლა ვუყურებ რას იზამს და მოგწერ რა გავიგე
@vaxop ჰო წმინდა საქმით ყოფილხარ დაკავებული :D :D :D კაი მე ჯერ ვმუშაობ და მოიწერე როგორც კი შეძლებ...
ესეიგი გვაქვს ერთი პირვატული ცვლადი statusCode , კონსტრუქტორი აბრუნებს ამ ცვლადს და გვაქვს მეთოდი რომელიც ამ ცვლადს ინახავს ლოკალურად.
ტესტ კლასსში გვაქვს ესეთი მეთოდი acceptRequest რომელსაც გადაეცემა HttpRequest ტიპის request ცვლადი და იმ statusCode-ს ანიჭებს request ის getStatusCode() მეთოდს და ბეჭდავს ამ statusCode--ს
@vaxop კონსტრუქტორი არ აბრუნებს არაფერს. მარტივი მიდგომაა:
set
ნიშნავს მინიჭებას;get
აღებას.მაგ კლასში გვაქვს ორი მეთოდი:
void setStatusCode(int statusCode)
ანუ setter(მიმნიჭებელი მეთოდი) რომელიც მიღებულ პარამეტრს "რაღაცას" უშვება(ამ შემთხვევაში პრივატულ ცვლადს ანიჭებს);int getStatusCode()
ანუ getter(წამკითხველი მეთოდი) რომელიც აბრუნებს int
ტიპის მნიშვნელობას. ამ შემთხვევაში უბრალოდ პირვატულ statuCode
ცვლადის მნიშვნელობას.აქედან დასკვნა ასეთია:
getter
(წამკითხველი) მეთოდები.აააა გასაგებია... ეხლა
public static void acceptRequest(HttpRequest request) {
int statusCode = request.getStatusCode();
System.out.println(statusCode);
request.setStatusCode(700);
System.out.println(statusCode);
}
ამ ცვლილებას შევიტან და ამ შეკითხვაზე მოგწერ პასუხს:
და გააცნობიერო რას იწვევს ეს ცვლილება და რატომ ხდება ის რაც ხდება და როგორც ხდება.
სატესტო კლასში ვაკეთებთ შემდეგს:
HttpRequestWrapper
ობიექტს და ვაკონფიგურირებთ მას(setStatusCode(xxx)
).acceptRequest(...)
მეთოდი.HttpRequest
ინტერფეისისა და მის მიარ განსაზღვრული მეთოდების შესახებ(ამ შემთხვევაში getStatusCode()
ერთი კითხვა (არ მცემოთ:)) )
ვქმნით HttpRequestWrapper ობიექტს და ვაკონფიგურირებთ მას(setStatusCode(xxx)). <<<< ეს დაკონფიგურება რას ნიშნავს
ვქმნით HttpRequestWrapper ობიექტს და ვაკონფიგურირებთ მას(setStatusCode(xxx)). <<<< ეს დაკონფიგურება რას ნიშნავს
- დაკონფიგურირება ნიშნავს რომ მას გადავცემთ საწყის მნიშვნელობებს.
- ზოგადად ობიექტი განისაზღვრება მისი მდგომარეობით.
- მდგომარეობა პროგრამირებაში აღიწერება ცვლადებითა და ამ ცვლადების მნიშვნელობებით.
- პრივატულ ცვლადებს ვიყენებთ ზუსტად მაგ მიზნით - მათში ვინახავთ მნიშვნელობებებს რომლებიც განსაზღვრავენ ობიექტის მდგომარეობას.
უფრო მოკლედ: დაკონფიგურირება = ობიექტის ცვლადებისთვის მნიშვნელობების მინიჭება
მადლობა
@vaxop იმ ცვლილებებს რომ განახორციელებ რაც მოიწერე მერე შემატყობინე, იმედია "პერესტრელკას" გადაურჩები :P
შევიტანე ცვლილება და გამიწითლა setStatusCode(700) იმიტომ რომ HttpRequest ინტერფეისში არ მაქვს აღწერილი ხო?
@vaxop you nailed it!
ეგ არის მთავარი მორალი. ანუ სადღაც სხვაგან სხვა საშუალებით ვახდენთ რეალურად request
ობიექტის ფორმირებას თავისი მდგომარეობითურთ, ხოლო დაინტერესებულ მხარეებს ვაწვდით მხოლოდ იმას რაც HttpRequest
ინტერფეისში გვაქვს აღწერილი(დაშვებული). მნიშვნელოვანია რომ ეს კარგად გააცნობიერო.
ახლა ამ დეტალებიდან გამომდინარე, რას ფიქრობ შეძლებ რომ შენი საწყისი დავალების იმპლემენტაციას(რეალიზაციას) მიხედო?
@vaxop ჰე ან კი მითხარი ან არა, ეძინება სენსეის :sleepy:
ki xval dilidan davcxeb ragaceebs da shegaxedebt xolme dro da dro kargit?
HttpRequestWrapper
კლასის იმპლემენტაცია შემდეგ ინტერფეისზე დაყრდნობით: