Từ viết tắt trong CamelCase [đã đóng]


243

Tôi có một nghi ngờ về CamelCase. Giả sử bạn có từ viết tắt này:Unesco = United Nations Educational, Scientific and Cultural Organization.

Bạn nên viết: unitedNationsEducationalScientificAndCulturalOrganization

Nhưng nếu bạn cần viết từ viết tắt thì sao? Cái gì đó như:

getUnescoProperties();

Có đúng không khi viết nó theo cách này? getUnescoProperties() OR getUNESCOProperties();


2
Điều này có nên trên các lập trình viên không?
Pacerier

5
IMO chuyển đổi sang Snake_case cho thấy giải pháp tốt nhất. Bạn có thích get_unesco_propertieshay get_u_n_e_s_c_o_propertieskhông?
jchook


Câu trả lời:


195

Một số nguyên tắc Microsoft đã viết camelCaselà:

Khi sử dụng các từ viết tắt, sử dụng trường hợp Pascal hoặc trường hợp lạc đà cho các từ viết tắt dài hơn hai ký tự. Ví dụ, sử dụng HtmlButtonhoặc htmlButton. Tuy nhiên, bạn nên viết hoa các từ viết tắt chỉ bao gồm hai ký tự, chẳng hạn như System.IOthay vì System.Io.

Không sử dụng chữ viết tắt trong mã định danh hoặc tên tham số. Nếu bạn phải sử dụng chữ viết tắt, hãy sử dụng vỏ lạc đà cho các chữ viết tắt bao gồm nhiều hơn hai ký tự, ngay cả khi điều này mâu thuẫn với chữ viết tắt tiêu chuẩn của từ này.

Tổng hợp:

  • Khi bạn sử dụng một từ viết tắt hoặc viết tắt dài hai ký tự, hãy đặt tất cả chúng thành chữ hoa;

  • Khi từ viết tắt dài hơn hai ký tự, hãy sử dụng chữ hoa cho ký tự đầu tiên.

Vì vậy, trong trường hợp cụ thể của bạn, getUnescoProperties()là chính xác.


11
Tôi đoán tôi nên bắt đầu sử dụng IDthay thế Id(mà tôi sử dụng / nhìn thấy ở mọi nơi)
jasonscript 19/12/13

30
Về mặt kỹ thuật "ID" không phải là từ viết tắt (nó là viết tắt của "định danh" hoặc "nhận dạng"), nhưng tôi thực sự không biết làm thế nào / nếu hướng dẫn này giúp với cái đó. : - \
bryant

63
Tôi không nghĩ rằng đây là một tiêu chuẩn tốt. Phân biệt các từ viết tắt thông thường, các từ viết tắt hai chữ cái và các từ bình thường dường như quá phức tạp và trái với ý tưởng có một quy ước đặt tên nhất quán.
Sam

40
Ngoài ra, được tuyên bố bởi Microsoft không làm cho một cái gì đó "chính xác".
Sam

48
Thật tuyệt khi biết họ làm theo hướng dẫn riêng của họ: XMLHttpRequest()ban đầu đến từ Microsoft.
Makyen

314

Có những lời chỉ trích chính đáng về lời khuyên của Microsoft từ câu trả lời được chấp nhận.

  • Điều trị không nhất quán các từ viết tắt / khởi tạo tùy thuộc vào số lượng ký tự:
    • playerIDvs playerIdvs playerIdentifier.
  • Câu hỏi về việc liệu các từ viết tắt hai chữ cái vẫn nên được viết hoa nếu chúng xuất hiện ở đầu số nhận dạng:
    • USTaxes đấu với usTaxes
  • Khó khăn trong việc phân biệt nhiều từ viết tắt:
    • tức là USIDvs usId(hoặc parseDBMXMLtrong ví dụ của Wikipedia).

Vì vậy, tôi sẽ đăng câu trả lời này như là một thay thế cho câu trả lời được chấp nhận. Tất cả các từ viết tắt nên được điều trị nhất quán; từ viết tắt nên được đối xử như bất kỳ từ nào khác. Trích dẫn Wikipedia :

... một số lập trình viên thích xử lý chữ viết tắt như thể chúng là những từ viết thường ...

Vì vậy, câu hỏi của OP, tôi đồng ý với câu trả lời được chấp nhận; chính xác:getUnescoProperties()

Nhưng tôi nghĩ rằng tôi đã đi đến một kết luận khác trong các ví dụ sau:

  • US TaxesusTaxes
  • Player IDplayerId

Vì vậy, hãy bỏ phiếu cho câu trả lời này nếu bạn nghĩ các từ viết tắt hai chữ cái nên được đối xử như các từ viết tắt khác.

Camel Case là một quy ước, không phải là một đặc điểm kỹ thuật. Vì vậy, tôi đoán quy tắc ý kiến ​​phổ biến.

( EDIT: Xóa đề xuất này rằng phiếu bầu sẽ quyết định vấn đề này, như @Brian David nói; Stack Overflow không phải là "cuộc thi phổ biến" và câu hỏi này đã được đóng lại dưới dạng "dựa trên ý kiến")

Mặc dù nhiều người thích đối xử với các từ viết tắt như bất kỳ từ nào khác, nhưng thực tế phổ biến hơn có thể là đặt các từ viết tắt trong tất cả các chữ hoa (mặc dù nó dẫn đến "gớm ghiếc")

Các nguồn lực khác:

  • Lưu ý một số người phân biệt giữa viết tắt và viết tắt
  • Lưu ý Nguyên tắc của Microsoft phân biệt giữa các từ viết tắt hai ký tự và "từ viết tắt dài hơn hai ký tự"
  • Lưu ý một số người khuyên nên tránh viết tắt / viết tắt hoàn toàn
  • Lưu ý một số người khuyên nên tránh hoàn toàn CamelCase / PascalCase
  • Lưu ý một số người phân biệt giữa "tính nhất quán" là "quy tắc có vẻ không nhất quán trong nội bộ" (nghĩa là xử lý các từ viết tắt hai ký tự khác với các từ viết tắt ba ký tự); một số người định nghĩa "tính nhất quán" là "áp dụng cùng một quy tắc một cách nhất quán" (ngay cả khi quy tắc này không nhất quán trong nội bộ)
  • Nguyên tắc thiết kế khung
  • Nguyên tắc của Microsoft

26
1) Không có sự không nhất quán. "Id" là tên viết tắt , không phải là từ viết tắt. 2) Nó phụ thuộc vào ngữ cảnh của mã định danh, tức là lớp, giao diện, thuộc tính, kiểu liệt kê, trường tĩnh, tham số, phương thức, thuộc tính hoặc sự kiện. Nếu hướng dẫn cho mã định danh đang sử dụng PascalCase, thì nó sẽ là USTaxesPlayerId; camelCase: usTaxesplayerId. 3) Nó sẽ có USIdtrong PascalCase, usIdtrong camelCase và parseDbmXmltrong camelCase.
Frederik Krautwald

6
Bạn nói đúng, đó là một từ viết tắt. Quan điểm của tôi là nó phải là UsTaxes, UsId. Không nên dùng hai chữ cái "viết tắt hoặc viết tắt" khác với ba chữ cái hoặc các từ "bình thường" khác. Lời khuyên khác, từ câu trả lời của @ Eonil, là tránh rút ngắn hoàn toàn. unitedStatesTaxes hoặc playerIdentifier.
Hạt đậu đỏ

3
Ha ha. Tôi nghi ngờ sự nhầm lẫn sẽ phát sinh - nhiều - nhưng các hướng dẫn là, tốt, hướng dẫn để ngăn ngừa sự nhầm lẫn có thể. Một ví dụ viết tắt (xấu) giả định trong bối cảnh khoa học: InIN(item)vs InIn(item)(gợi ý: IN là inch (es)). Hoặc, IDById(id)vs IdById(id), khoa học bối cảnh (gợi ý: ID có nghĩa là sự tuyệt vọng truyền nhiễm). "Hai ký tự dài" - trong bối cảnh nào?
Frederik Krautwald

2
Tại liên kết của Microsoft "... sử dụng vỏ Pascal hoặc vỏ lạc đà cho các từ viết tắt dài hơn hai ký tự . ... Tuy nhiên, bạn nên viết hoa các từ viết tắt chỉ bao gồm hai ký tự ..." Đó là phần tôi sẽ gọi là "không nhất quán ". Đặc tính tốt hơn là "ngoại lệ". Và ít nhất bạn đã hợp lý hóa lý do tại sao hai từ viết tắt có thể gây nhầm lẫn nhiều hơn. Nhưng tôi đoán những chương trình với "CanCan" không gặp may; mơ hồ cho dù đó là bước nhảy, hay Mạng cộng đồng của Cercle de l'Avir de Nantes :)
Hạt đậu đỏ

18
Tác giả của Capital Offense: Cách xử lý các từ viết tắt trong CamelCase gọi chính xác thuật ngữ "gớm ghiếc" khi anh ta viết: "Trong khi [sử dụng các từ viết tắt chữ hoa] hoạt động trong các trường hợp đơn giản, nó dẫn đến sự gớm ghiếc khi một từ viết tắt theo sau: HTTPURLConnection, XMLIDREF"
kghastie 14/07/2015

21

Đầu tiên, tôi phải làm rõ rằng tôi không phải là người nói tiếng Anh bản địa , vì vậy yêu cầu của tôi về ngữ pháp tiếng Anh có thể đơn giản là sai. Nếu bạn phát hiện ra những lỗi như vậy, xin vui lòng cho tôi biết, và tôi sẽ rất biết ơn.


Thực hành tốt nhất cho các từ viết tắt sẽ là tránh các từ viết tắt càng nhiều càng tốt. Dù sao, đây không phải là trường hợp vì từ viết tắt UNESCOquen thuộc hơn tên đầy đủ UnitedNationsEducationalScientificAndCulturalOrganization.

Sau đó, tôi nghĩ UNESCOcó ý nghĩa hơn là Unescovì đơn giản là nó gần với dạng sống thực hơn nên quen thuộc hơn. Tôi đã có một số rắc rối để tìm ra từ Unescothực sự có nghĩa là gì.

Như một ví dụ khác, hãy nghĩ về Arc. Điều này nghe có vẻ như một đường cong xung quanh một vòng tròn, nhưng trong Rust, điều này có nghĩa Atomically Reference Counted. Nếu nó được viết như thế ARC, ít nhất độc giả sẽ nhận ra rằng từ này là từ viết tắt của một thứ khác chứ không phải là một loại đường cong.

Các chương trình hiện đại được viết chủ yếu cho độc giả của con người. Sau đó, các quy tắc đặt tên phải được đặt cho khả năng đọc của con người thay vì xử lý hoặc phân tích máy.

Trong viễn cảnh này, chúng tôi mất một số khả năng đọc bằng cách sử dụng Unescotrong UNESCOkhi không đạt được gì.

Và đối với bất kỳ trường hợp nào khác, tôi nghĩ chỉ cần tuân theo các quy tắc viết tắt tiếng Anh đơn giản (hoặc quy ước) là đủ cho hầu hết các trường hợp để dễ đọc nhất .


4
Các ví dụ trên là một chút sai lệch. "Cách tiếp cận tốt nhất tôi từng thấy là của Apple ... Điều đó có nghĩa là đối xử với các từ viết tắt như một danh từ riêng ... Vì vậy, UNESCO có ý nghĩa hơn" - Đó không phải là cách bạn viết các danh từ thích hợp.
Mikko Rantanen

@MikkoRantanen Tôi đã cập nhật câu trả lời của mình.
Eonil

7
Wow tôi khó có thể tìm thấy một câu trong câu trả lời mà tôi đồng ý với :-)
Josef Sábl

Nó hoàn toàn phụ thuộc vào ngữ cảnh của mã bạn đang làm việc cho dù chữ viết tắt / từ viết tắt có ý nghĩa nhiều hay ít. Chẳng hạn, tôi làm việc trong lĩnh vực tài chính, và có rất nhiều thuật ngữ độc đáo thống nhất trong toàn ngành và trên thực tế là toàn bộ thế giới. Bạn sẽ lãng phí thời gian và tạo ra sự dài dòng không cần thiết bằng cách không sử dụng các từ viết tắt mà tất cả những người sẽ làm việc tại công ty đó đều biết. Ví dụ: PV cho giá trị hiện tại, FV cho giá trị tương lai, trung bình, exp cho số mũ, v.v.
Will Ediger

@ pm100 Không phải đó là những gì tôi nói sao? UNESCO không phải là cách bạn viết danh từ thích hợp.
Mikko Rantanen

17

Để chuyển đổi sang CamelCase, cũng có thuật toán trường hợp Lạc đà xác định (gần như) của Google :

Bắt đầu với hình thức văn xuôi của tên:

  1. Chuyển đổi cụm từ sang ASCII đơn giản và loại bỏ bất kỳ dấu nháy đơn nào. Ví dụ: "Thuật toán Müller" có thể trở thành "Thuật toán Mueller".
  2. Chia kết quả này thành các từ, tách trên khoảng trắng và bất kỳ dấu chấm câu nào còn lại (thường là dấu gạch nối).
    1. Khuyến nghị: nếu bất kỳ từ nào đã có sự xuất hiện của trường hợp lạc đà thông thường, hãy chia từ này thành các phần cấu thành của nó (ví dụ: "AdWords" trở thành "từ quảng cáo"). Lưu ý rằng một từ như "iOS" không thực sự nằm trong trường hợp lạc đà mỗi se; nó bất chấp quy ước, vì vậy khuyến nghị này không áp dụng.
  3. Bây giờ viết thường mọi thứ (bao gồm các từ viết tắt), sau đó viết hoa chỉ ký tự đầu tiên của:
    1. Mỗi từ, để mang lại trường hợp lạc đà trên, hoặc
    2. Mỗi từ trừ từ đầu tiên, để mang lại trường hợp lạc đà thấp hơn
  4. Cuối cùng, nối tất cả các từ vào một định danh duy nhất.

Lưu ý rằng vỏ của các từ gốc gần như hoàn toàn không được chú ý.

Trong các ví dụ sau, "yêu cầu HTTP XML" được chuyển đổi chính xác thành XmlHttpRequest, XMLHTTPRequest không chính xác.


17

getUnescoProperties() nên là giải pháp tốt nhất ...

Khi có thể chỉ cần làm theo thuần túy camelCase, khi bạn có từ viết tắt, hãy để chúng viết hoa khi có thể camelCase.

Nói chung trong các biến lập trình OO nên bắt đầu bằng chữ in thường ( lowerCamelCase) và lớp nên bắt đầu bằng chữ in hoa ( UpperCamelCase).

Khi nghi ngờ chỉ cần đi trong sạch camelCase;)

parseXMLlà tốt, parseXmlcũng đượccamelCase

XMLHTTPRequestnên XmlHttpRequesthoặc xmlHttpRequestkhông có cách nào để đi với các từ viết tắt chữ hoa tiếp theo, nó không rõ ràng cho tất cả các trường hợp thử nghiệm.

ví dụ như làm thế nào để bạn đọc từ này HTTPSSLRequest, HTTP + SSLhoặc HTTPS + SL(mà không phải bất cứ điều gì có ý nghĩa nhưng ...), trong đó trường hợp sau ước trường hợp lạc đà và đi cho httpSslRequesthay httpsSlRequest, có lẽ nó không còn tốt đẹp, nhưng nó chắc chắn là rõ ràng hơn.


2
Tôi thích HTTPSSLví dụ của bạn , mặc dù SL không có ý nghĩa gì, thế còn một thứ như HTTPSSHTunnel thì sao? Đó là HTTPS + SH (shell) hay HTTP + SSH? Hội nghị Google chắc chắn là ít mơ hồ.
L. Holanda

10

Hướng dẫn về phong cách JavaScript của airbnb tại github với rất nhiều ngôi sao (~ 57,5k tại thời điểm này) và hướng dẫn về các từ viết tắt có nội dung:

Từ viết tắt và chữ viết tắt phải luôn luôn được viết hoa hoặc viết tắt.

Tại sao? Tên là để dễ đọc, không phải để xoa dịu một thuật toán máy tính.

// bad
import SmsContainer from './containers/SmsContainer';

// bad
const HttpRequests = [
  // ...
];

// good
import SMSContainer from './containers/SMSContainer';

// good
const HTTPRequests = [
  // ...
];

// also good
const httpRequests = [
  // ...
];

// best
import TextMessageContainer from './containers/TextMessageContainer';

// best
const requests = [
  // ...
];

7
" Tại sao? Tên là để dễ đọc, không phải để xoa dịu thuật toán máy tính ", vậy, XMLHTTPRequestcách nào dễ đọc hơn XmlHttpRequest, phải không?
L. Holanda

2
Không có nghĩa tại sao httpRequestsđược coi là tốt nhưng HttpRequestslà xấu. Theo nguyên tắc này sau đó, đối với Yêu cầu HTTP XML phải là xmlhttpRequest???
L. Holanda

1
Tôi thường trích dẫn hướng dẫn về phong cách AirBnb, nhưng trong trường hợp này tôi không đồng ý. Tôi đặc biệt không đồng ý với tuyên bố của họ: "Từ viết tắt và chữ viết tắt phải luôn luôn là chữ hoa hoặc chữ thường." xmlHttpRequestlà dễ đọc hơn XMLHTTPRequesttheo ý kiến ​​của tôi.
Ronan

3

Hiện tại tôi đang sử dụng các quy tắc sau:

  1. Trường hợp vốn từ viết tắt: XMLHTTPRequest, xmlHTTPRequest, requestIPAddress.

  2. Camel trường hợp đối với chữ viết tắt: ID[entifier], Exe[cutable], App[lication].

ID là một ngoại lệ, xin lỗi nhưng sự thật

Khi tôi thấy một chữ cái viết hoa, tôi giả sử một từ viết tắt, tức là một từ riêng cho mỗi chữ cái. Chữ viết tắt không có các từ riêng biệt cho mỗi chữ cái, vì vậy tôi sử dụng trường hợp lạc đà.

XMLHTTPRequest là mơ hồ, nhưng đó là một trường hợp hiếm hoi và nó không quá mơ hồ, vì vậy nó ổn, các quy tắc và logic quan trọng hơn vẻ đẹp.


1

Hướng dẫn kiểu JavaScript Airbnb nói một chút về điều này . Về cơ bản:

// bad
const HttpRequests = [ req ];

// good
const httpRequests = [ req ];

// also good
const HTTPRequests = [ req ];

Bởi vì tôi thường đọc một chữ in hoa hàng đầu như một lớp, tôi có xu hướng tránh điều đó. Vào cuối ngày, đó là tất cả các ưu tiên.


1

Ngoài những gì @valex đã nói, tôi muốn tóm tắt một vài điều với các câu trả lời cho câu hỏi này.

Tôi nghĩ rằng câu trả lời chung là: nó phụ thuộc vào ngôn ngữ lập trình mà bạn đang sử dụng.

C sắc nét

Microsoft đã viết một số hướng dẫn trong đó có vẻ như đó HtmlButtonlà cách đúng để đặt tên một lớp cho trường hợp này.

Javascript

Javascript có một số biến toàn cục với các từ viết tắt và nó sử dụng tất cả chúng trong chữ hoa (nhưng vui thay, không phải lúc nào cũng nhất quán) đây là một số ví dụ:

encodeURIComponent XMLHttpRequest toJSON toISOString


Vâng, Netscape đã cũ, nó thậm chí còn có một số không có camelCase onerror.
Eddie

1

từ chối trách nhiệm: Tiếng Anh không phải là giọng mẹ tôi. Nhưng tôi đã suy nghĩ về vấn đề này trong một thời gian dài, đặc biệt là khi sử dụng nút (kiểu camelcase) để xử lý cơ sở dữ liệu do tên của các trường bảng sẽ bị rắn, đây là suy nghĩ của tôi:

Có 2 loại 'từ viết tắt' cho một lập trình viên:

  • trong ngôn ngữ tự nhiên, UNESCO
  • trong ngôn ngữ lập trình máy tính, ví dụ, tmc and textMessageContainerthường xuất hiện dưới dạng một biến cục bộ.

Trong thế giới lập trình, tất cả các từ viết tắt trong ngôn ngữ tự nhiên nên được coi là từ , lý do là:

  1. Khi chúng ta lập trình, chúng ta nên đặt tên một biến theo kiểu viết tắt hoặc kiểu không viết tắt. Vì vậy, nếu chúng ta đặt tên một hàm là getUNESCOProperies, điều đó có nghĩa là UNESCO là từ viết tắt (nếu không thì không phải là chữ in hoa), nhưng rõ ràng, getpropertieskhông phải là từ viết tắt. vì vậy, chúng ta nên đặt tên cho hàm này là gunescop hoặc getUnitedNationsEducationalSellectificAndCestationOrganizationProperies , cả hai đều không được chấp nhận.

  2. ngôn ngữ tự nhiên đang phát triển liên tục, và các từ viết tắt ngày nay sẽ trở thành từ mommorow , nhưng các chương trình nên độc lập với xu hướng này và tồn tại mãi mãi.

Nhân tiện, trong câu trả lời được bình chọn nhiều nhất, IO là từ viết tắt trong ý nghĩa ngôn ngữ máy tính (viết tắt của InputOutput), nhưng tôi không thích tên này, vì tôi nghĩ từ viết tắt (trong ngôn ngữ máy tính) chỉ nên được sử dụng để đặt tên một biến cục bộ nhưng một lớp / hàm cấp cao nhất, vì vậy nên sử dụng InputOutput thay vì IO


"Lưỡi", không phải "âm điệu"
Dan Dascalescu

0

UNESCO là một trường hợp đặc biệt vì thông thường (bằng tiếng Anh) được đọc dưới dạng từ chứ không phải từ viết tắt - như UEFA, RADA, BAFTA và không giống như BBC, HTML, SSL


1
Đây là sự phân biệt giữa "từ viết tắt" và chỉ "chữ viết tắt"; sự khác biệt này dường như có liên quan đến toàn bộ cuộc thảo luận, nhưng gần như hoàn toàn bị loại bỏ trong các câu trả lời được trình bày.
simon

BBC, HTML, SSL và các từ viết tắt khác mà bạn phát âm ra từng chữ cái được gọi chính xác hơn là chữ viết tắt. Những từ như UNESCO được phát âm là một từ là từ viết tắt thực sự.
Lrdwhyt

-2

Ngoài ra còn có một quy ước về lạc đà khác cố gắng ưu tiên khả năng đọc cho các từ viết tắt bằng cách sử dụng chữ hoa ( HTML) hoặc chữ thường ( html), nhưng tránh cả hai ( Html).

Vì vậy, trong trường hợp của bạn, bạn có thể viết getUNESCOProperties. Bạn cũng có thể viết unescoPropertiescho một biến, hoặcUNESCOProperties cho một lớp (quy ước cho các lớp là bắt đầu bằng chữ hoa).

Quy tắc này trở nên khó khăn nếu bạn muốn kết hợp hai từ viết tắt, ví dụ cho một lớp có tên XML HTTP Request. Nó sẽ bắt đầu bằng chữ hoa, nhưng vì XMLHTTPRequestsẽ không dễ đọc (có phải là Yêu cầu TTP XMLH không?) VàXMLhttpRequest sẽ phá vỡ quy ước về lạc đà (có phải là Yêu cầu XM Lhttp không?), Tùy chọn tốt nhất sẽ là trộn trường hợp : XMLHttpRequest, đó là thực sự những gì W3C đã sử dụng . Tuy nhiên, việc sử dụng loại đặt tên này không được khuyến khích. Trong ví dụ này, HTTPRequestsẽ là một cái tên tốt hơn.

Vì từ tiếng Anh chính thức để nhận dạng / nhận dạng dường như là ID, mặc dù không phải là từ viết tắt, bạn có thể áp dụng các quy tắc tương tự ở đó.

Quy ước này dường như khá phổ biến ngoài kia, nhưng nó chỉ là một quy ước và không có đúng hay sai. Chỉ cần cố gắng tuân theo một quy ước và đảm bảo tên của bạn có thể đọc được.


3
Tôi không tin toàn bộ chủ đề này :-) Vì vậy, nó sẽ là XMLToHtmlConverter nhưng HTMLToXmlConverter? Ồ ...
Josef Sábl

1
@ JosefSábl, vâng, nó sẽ như thế. Về downvote của bạn, tôi không nói rằng tôi thích quy ước này, nhưng nó chắc chắn tồn tại.
Jesús Carrera

1
Tôi đọc câu hỏi là "Quy ước tốt để viết Accronyms trong trường hợp lạc đà" không phải là "Bạn có thể liệt kê tất cả các quy ước tồn tại". Và khi tôi coi quy ước được đề cập của bạn là rất tệ, tôi đã đánh giá thấp :-)
Josef Sábl

Vâng, câu hỏi là "Viết nó theo cách này có đúng không?", Và vì có nhiều cách viết "đúng" bởi vì nó chỉ là một quy ước, và quy ước này khá phổ biến (bất kể bạn nghĩ như thế nào), tôi câu trả lời rất hợp lệ :-)
Jesús Carrera
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.