Chính thống giáo là gì?


Câu trả lời:


255

Tính trực giao là thuộc tính có nghĩa là "Thay đổi A không thay đổi B". Một ví dụ về hệ thống trực giao sẽ là radio, trong đó việc thay đổi đài không thay đổi âm lượng và ngược lại.

Một hệ thống không trực giao sẽ giống như một máy bay trực thăng, nơi thay đổi tốc độ có thể thay đổi hướng.

Trong các ngôn ngữ lập trình, điều này có nghĩa là khi bạn thực hiện một lệnh, không có gì ngoài lệnh đó xảy ra (rất quan trọng để gỡ lỗi).

Cũng có một ý nghĩa cụ thể khi đề cập đến các bộ hướng dẫn .


Câu trả lời này nhắc nhở tôi về lý thuyết "chồng chất" từ tín hiệu và hệ thống.
Özgür

1
Một lời giải thích rất rõ ràng về các cách sử dụng khác nhau của từ này: c2.com/cgi/wiki?DefDefOfOrthogonal
Lorenzo Solano

Vậy lập trình hàm có hoàn toàn trực giao?
corazza

Đó là một câu hỏi thú vị @yannbane. Về lý thuyết, tùy thuộc vào ngôn ngữ chức năng lý thuyết, nó có thể đúng. Trong thực tế không, ngay cả các ngôn ngữ chức năng cũng có cách để thay đổi trạng thái.
C. Ross

1
Tôi cá rằng ví dụ máy bay trực thăng là từ "Lập trình viên thực dụng" :)
Saletanth Karumanaghat

36

Từ "Nghệ thuật lập trình UNIX" của Eric S. Raymond

Tính trực giao là một trong những tính chất quan trọng nhất có thể giúp làm cho các thiết kế phức tạp thậm chí nhỏ gọn. Trong một thiết kế hoàn toàn trực giao, các hoạt động không có tác dụng phụ; mỗi hành động (cho dù đó là lệnh gọi API, gọi macro hay thao tác ngôn ngữ) chỉ thay đổi một điều mà không ảnh hưởng đến người khác. Có một và chỉ một cách để thay đổi từng thuộc tính của bất kỳ hệ thống nào bạn đang kiểm soát.


16

Hãy nghĩ về nó đã có thể thay đổi một điều mà không có ảnh hưởng vô hình trên một phần khác.


12

Nếu bạn có một bộ các cấu trúc. Một ngôn ngữ được gọi là trực giao nếu nó cho phép lập trình viên trộn các cấu trúc này một cách tự do. Ví dụ: trong C bạn không thể trả về một mảng (mảng tĩnh), C được cho là không chính thức trong trường hợp này:

int[] fun(); // you can't return a static array.
// Of course you can return a pointer, but the langauge allows passing arrays.
// So, it is unorthognal in case.

Thật ra tôi đã thấy điều này trong cuốn sách của mình và vẫn không hiểu đó là gì.
AhmetB - Google

LOL Tôi đang sử dụng cuốn sách này và thấy câu hỏi này trong bài kiểm tra trực tuyến của cuốn sách. Thật là một sự trùng hợp. Có lẽ tôi cũng nên đọc chương đầu tiên.
AhmetB - Google

2
Nó chỉ đơn giản nói rằng trả về và mảng phức tạp hơn khi kết hợp với nhau: bạn không thể sử dụng trả về xung quanh mảng mà không nghĩ về sự tương tác giữa chúng. Lý tưởng nhất là bạn sẽ biết trả về nghĩa là gì và mảng là gì và vì vậy bạn sẽ biết trả về một mảng sẽ làm gì, nhưng thực tế, nó phức tạp hơn thế, bởi vì C tiết lộ chi tiết triển khai về mảng (và trả về).
Lee B

Ý nghĩa "trực giao" này được đề cập bởi: en.wikipedia.org/wiki/Orthogonality_(programming) , nhưng đó là một trang mới với ít nội dung.
outis

1
Đây là câu trả lời "đúng hơn" về tính trực giao trong bối cảnh lập trình. "Tính trực giao" có nghĩa là một cấu trúc lập trình có thể được trộn lẫn với bất kỳ cấu trúc nào khác và ngữ nghĩa của nó sẽ vẫn giữ nguyên.
treecoder

11

Nhìn rộng ra, tính trực giao là mối quan hệ giữa hai thứ sao cho chúng có ảnh hưởng tối thiểu với nhau.

Thuật ngữ này xuất phát từ toán học, trong đó hai vectơ là trực giao nếu chúng giao nhau ở các góc vuông.

Hãy suy nghĩ về một không gian cartesian 2 chiều điển hình (bạn lưới điển hình với các trục X / Y). Vẽ hai dòng: x = 1 và y = 1. Hai dòng là trực giao. Bạn có thể thay đổi x = 1 bằng cách thay đổi x và điều này sẽ không có hiệu lực trên dòng khác và ngược lại.

Trong phần mềm, thuật ngữ này có thể được sử dụng một cách thích hợp trong các tình huống khi bạn nói về hai phần của một hệ thống hoạt động độc lập với nhau.


5

Hầu hết các câu trả lời rất dài dòng, và thậm chí tối nghĩa. Vấn đề là: nếu một công cụ là trực giao, nó có thể được thêm, thay thế hoặc loại bỏ, có lợi cho các công cụ tốt hơn, mà không làm hỏng mọi thứ khác.

Đó là sự khác biệt giữa thợ mộc có búa và cưa, có thể dùng để đập hoặc cưa, hoặc có một số tổ hợp búa / cưa mới, được thiết kế để cưa gỗ, sau đó đập nó lại với nhau. Hoặc là sẽ làm việc để cưa và sau đó đập cùng nhau, nhưng nếu bạn nhận được một số nhiệm vụ đòi hỏi phải cưa, nhưng không búa, thì chỉ có các công cụ trực giao sẽ hoạt động. Tương tự như vậy, nếu bạn cần vặn vít thay vì búa, bạn sẽ không cần vứt cưa, nếu đó là trực giao (không trộn lẫn với) búa của bạn.

Ví dụ kinh điển là các công cụ dòng lệnh unix: bạn có một công cụ để lấy nội dung của đĩa (dd), một công cụ khác để lọc các dòng từ tệp (grep), một công cụ khác để ghi các dòng đó vào tệp (cat), v.v. tất cả có thể được trộn và kết hợp theo ý muốn.


2

Trong khi nói về các quyết định của dự án về ngôn ngữ lập trình, tính trực giao có thể được xem là bạn dễ dàng dự đoán những điều khác về ngôn ngữ đó như những gì bạn đã thấy trong quá khứ.

Chẳng hạn, trong một ngôn ngữ bạn có thể có:

str.split

để tách một chuỗi và

len (str)

để có được chiều dài.

Trên một ngôn ngữ trực giao hơn, bạn sẽ luôn sử dụng str.x hoặc x (str).

Khi bạn sao chép một đối tượng hoặc làm bất cứ điều gì khác, bạn sẽ biết có nên sử dụng

bản sao (obj)

hoặc là

obj.clone

Đó là một trong những điểm chính trên các ngôn ngữ lập trình là trực giao. Điều đó tránh cho bạn tham khảo hướng dẫn hoặc hỏi ai đó.

Bài viết trên wikipedia nói nhiều hơn về tính trực giao trên các thiết kế phức tạp hoặc ngôn ngữ cấp thấp. Như một người nào đó đã đề xuất ở trên về một bình luận, cuốn sách của Sabesta nói rõ ràng về tính trực giao.

Nếu tôi chỉ sử dụng một câu, tôi sẽ nói rằng ngôn ngữ lập trình là trực giao khi các phần chưa biết của nó hoạt động như mong đợi dựa trên những gì bạn đã thấy. Hoặc ... không có gì bất ngờ.

;)


Câu trả lời này không phù hợp với người khác; điều này chỉ khẳng định tính nhất quán giữa các lệnh gọi hàm hoặc cấu trúc tổng thể trái ngược với các lệnh khác nằm trên các dòng "ít khớp nối" hoặc "không có tác dụng phụ".
Özgür

Đây là cách sử dụng tôi thường nghe. Tôi nghĩ lý do trực giao là vì nếu bạn có X.ToString và X.GetType, bạn có thể thay đổi đối tượng và cú pháp giống nhau hoặc bạn có thể thay đổi hàm và cú pháp giống nhau. Đối tượng là độc lập của chức năng.
lùn

1

từ wikipedia :

Khoa học máy tính

Tính trực giao là một đặc tính thiết kế hệ thống tạo điều kiện cho tính khả thi và tính gọn nhẹ của các thiết kế phức tạp. Tính trực giao đảm bảo rằng việc sửa đổi hiệu ứng kỹ thuật được tạo ra bởi một thành phần của hệ thống không tạo ra cũng như không truyền các tác dụng phụ đến các thành phần khác của hệ thống. Hành vi mới nổi của một hệ thống bao gồm các thành phần nên được kiểm soát chặt chẽ bởi các định nghĩa chính thức về logic của nó chứ không phải bởi các tác dụng phụ do tích hợp kém, tức là thiết kế mô-đun và giao diện không trực giao. Tính trực giao làm giảm thời gian thử nghiệm và phát triển vì việc xác minh các thiết kế không gây ra tác dụng phụ cũng không phụ thuộc vào chúng dễ dàng hơn.

Ví dụ, một chiếc xe có các bộ phận và điều khiển trực giao (ví dụ: tăng tốc chiếc xe không ảnh hưởng gì khác ngoài các bộ phận liên quan riêng đến chức năng tăng tốc). Mặt khác, một thiết kế không trực giao có thể có khả năng lái ảnh hưởng đến hệ thống phanh của nó (ví dụ: kiểm soát ổn định điện tử) hoặc tốc độ của nó điều chỉnh hệ thống treo của nó. 1 Do đó, việc sử dụng này được coi là bắt nguồn từ việc sử dụng trực giao trong toán học: Người ta có thể chiếu một vector vào một không gian con bằng cách chiếu nó lên mỗi thành viên của một tập hợp các vectơ cơ sở riêng và thêm những dự khi và chỉ khi các vectơ cơ sở là trực giao lẫn nhau.

Một tập lệnh được gọi là trực giao nếu bất kỳ lệnh nào có thể sử dụng bất kỳ thanh ghi nào trong bất kỳ chế độ địa chỉ nào. Thuật ngữ này là kết quả của việc xem xét một lệnh như một vectơ có các thành phần là các trường hướng dẫn. Một trường xác định các thanh ghi sẽ được vận hành và một trường khác chỉ định chế độ địa chỉ. Một tập lệnh trực giao mã hóa duy nhất tất cả các kết hợp các thanh ghi và chế độ địa chỉ.


Ồ cảm ơn tôi vừa truy cập vào sơ khai này en.wikipedia.org/wiki/Orthogonality_%28programming%29 Xin lỗi.
AhmetB - Google

1

Từ Wikipedia :

Tính trực giao là một đặc tính thiết kế hệ thống tạo điều kiện cho tính khả thi và tính gọn nhẹ của các thiết kế phức tạp. Tính trực giao đảm bảo rằng việc sửa đổi hiệu ứng kỹ thuật được tạo ra bởi một thành phần của hệ thống không tạo ra cũng như không truyền các tác dụng phụ đến các thành phần khác của hệ thống. Hành vi mới nổi của một hệ thống bao gồm các thành phần nên được kiểm soát chặt chẽ bởi các định nghĩa chính thức về logic của nó chứ không phải bởi các tác dụng phụ do tích hợp kém, tức là thiết kế mô-đun và giao diện không trực giao. Tính trực giao làm giảm thời gian thử nghiệm và phát triển vì việc xác minh các thiết kế không gây ra tác dụng phụ cũng không phụ thuộc vào chúng dễ dàng hơn.

Ví dụ, một chiếc xe có các bộ phận và điều khiển trực giao (ví dụ: tăng tốc chiếc xe không ảnh hưởng gì khác ngoài các bộ phận liên quan riêng đến chức năng tăng tốc). Mặt khác, một thiết kế không trực giao có thể có khả năng lái ảnh hưởng đến hệ thống phanh của nó (ví dụ: kiểm soát ổn định điện tử) hoặc tốc độ của nó điều chỉnh hệ thống treo của nó. [1] Do đó, việc sử dụng này được coi là bắt nguồn từ việc sử dụng trực giao trong toán học: Người ta có thể chiếu một vectơ lên ​​một không gian con bằng cách chiếu nó lên từng thành viên của một tập các vectơ cơ sở và thêm các phép chiếu nếu và chỉ khi các vectơ cơ sở là lẫn nhau trực giao.

Một tập lệnh được gọi là trực giao nếu bất kỳ lệnh nào có thể sử dụng bất kỳ thanh ghi nào trong bất kỳ chế độ địa chỉ nào. Thuật ngữ này là kết quả của việc xem xét một lệnh như một vectơ có các thành phần là các trường hướng dẫn. Một trường xác định các thanh ghi sẽ được vận hành và một trường khác chỉ định chế độ địa chỉ. Một tập lệnh trực giao mã hóa duy nhất tất cả các kết hợp các thanh ghi và chế độ địa chỉ.

Nói một cách đơn giản nhất có thể, hai điều là trực giao nếu thay đổi cái này không ảnh hưởng gì đến cái kia.


1

Ví dụ về việc thiếu tính trực giao trong ngôn ngữ cấp cao, hãy xem xét các quy tắc và ngoại lệ sau trong C. Mặc dù C có hai loại dữ liệu có cấu trúc, mảng và bản ghi (cấu trúc), các bản ghi có thể được trả về từ các hàm nhưng không thể có mảng. Thành viên của cấu trúc có thể là bất kỳ loại dữ liệu nào ngoại trừ khoảng trống hoặc cấu trúc cùng loại. Một phần tử mảng có thể là bất kỳ kiểu dữ liệu nào ngoại trừ void hoặc hàm. Các tham số được truyền theo giá trị, trừ khi chúng là mảng, trong trường hợp đó, thực tế, chúng được truyền bằng tham chiếu (vì sự xuất hiện của tên mảng không có chỉ mục trong chương trình C được hiểu là địa chỉ của phần tử đầu tiên của mảng)


0

Trong các ngôn ngữ lập trình, một tính năng ngôn ngữ lập trình được gọi là trực giao nếu nó bị giới hạn không có giới hạn (hoặc ngoại lệ). Ví dụ, trong các hàm Pascal không thể trả về các kiểu có cấu trúc. Đây là một hạn chế về việc trả về các giá trị từ một hàm. Do đó, chúng tôi coi nó là một tính năng không trực giao. ;)


0

Tính trực giao trong lập trình:

Tính trực giao là một khái niệm quan trọng, giải quyết làm thế nào một số lượng nhỏ các thành phần có thể được kết hợp theo một số cách tương đối nhỏ để có được kết quả mong muốn. Nó gắn liền với sự đơn giản; thiết kế càng trực giao thì càng ít ngoại lệ. Điều này giúp dễ dàng hơn để học, đọc và viết chương trình bằng ngôn ngữ lập trình. Ý nghĩa của một tính năng trực giao là độc lập với bối cảnh; các tham số chính là đối xứng và nhất quán (ví dụ, một con trỏ là một khái niệm trực giao).

từ Wikipedia


0

Tính trực giao trong ngôn ngữ lập trình có nghĩa là một tập hợp các cấu trúc nguyên thủy tương đối nhỏ có thể được kết hợp theo một số cách tương đối nhỏ để xây dựng cấu trúc điều khiển và dữ liệu của ngôn ngữ. Hơn nữa, mọi sự kết hợp rõ ràng giữa các nguyên thủy là hợp pháp và có ý nghĩa. Ví dụ, hãy xem xét các loại dữ liệu. Giả sử một ngôn ngữ có bốn kiểu dữ liệu nguyên thủy (số nguyên, float, double và ký tự) và hai toán tử loại (mảng và con trỏ). Nếu hai toán tử loại có thể được áp dụng cho chính chúng và bốn loại dữ liệu nguyên thủy, một số lượng lớn cấu trúc dữ liệu có thể được xác định. Ý nghĩa của một tính năng ngôn ngữ trực giao là độc lập với bối cảnh xuất hiện của nó trong một chương trình. (từ trực giao xuất phát từ khái niệm toán học của vectơ trực giao, độc lập với nhau. ) Tính trực giao xuất phát từ sự đối xứng của các mối quan hệ giữa các nguyên tắc. Việc thiếu tính trực giao dẫn đến các ngoại lệ đối với các quy tắc của ngôn ngữ. Ví dụ, trong một ngôn ngữ lập trình hỗ trợ con trỏ, có thể xác định một con trỏ để trỏ đến bất kỳ loại cụ thể nào được xác định trong ngôn ngữ. Tuy nhiên, nếu con trỏ không được phép trỏ đến mảng, nhiều cấu trúc dữ liệu do người dùng xác định có thể hữu ích có thể được xác định. Chúng ta có thể minh họa việc sử dụng tính trực giao làm khái niệm thiết kế bằng cách so sánh một khía cạnh của ngôn ngữ lắp ráp của các máy tính lớn của IBM và loạt máy tính mini VAX. Chúng tôi xem xét một tình huống đơn giản: thêm hai giá trị nguyên 32 bit nằm trong bộ nhớ hoặc thanh ghi và thay thế một trong hai giá trị bằng tổng. Các máy tính lớn của IBM có hai hướng dẫn cho mục đích này,

A Reg1, memory_cell
AR Reg1, Reg2

Trong đó Reg1 và Reg2 đại diện cho các thanh ghi. Các ngữ nghĩa của những điều này là

Reg1 ← contents(Reg1) + contents(memory_cell)
Reg1 ← contents(Reg1) + contents(Reg2)

Hướng dẫn bổ sung VAX cho các giá trị nguyên 32 bit là

ADDL operand_1, operand_2

ngữ nghĩa của ai

operand_2 ← contents(operand_1) + contents(operand_2)

Trong trường hợp này, toán hạng có thể là một thanh ghi hoặc một ô nhớ. Thiết kế lệnh VAX là trực giao trong đó một lệnh đơn có thể sử dụng các thanh ghi hoặc các ô nhớ làm toán hạng. Có hai cách để xác định toán hạng, có thể được kết hợp theo tất cả các cách có thể. Thiết kế của IBM không trực giao. Chỉ có hai trong số bốn khả năng kết hợp toán hạng là hợp pháp và hai yêu cầu hướng dẫn khác nhau, A và AR. Thiết kế của IBM bị hạn chế nhiều hơn và do đó ít ghi hơn. Ví dụ: bạn không thể thêm hai giá trị và lưu tổng vào vị trí bộ nhớ. Hơn nữa, thiết kế của IBM khó học hơn vì những hạn chế và hướng dẫn bổ sung. Tính trực giao có liên quan chặt chẽ đến sự đơn giản: Thiết kế ngôn ngữ càng trực giao thì càng ít ngoại lệ mà các quy tắc ngôn ngữ yêu cầu. Ít ngoại lệ hơn có nghĩa là mức độ đều đặn hơn trong thiết kế, giúp ngôn ngữ dễ học, đọc và hiểu hơn. Bất cứ ai đã học một phần quan trọng của ngôn ngữ tiếng Anh đều có thể làm chứng cho sự khó khăn khi học nhiều ngoại lệ quy tắc của nó (ví dụ: i trước e trừ sau c).


0

Tính trực giao có nghĩa là mức độ mà ngôn ngữ bao gồm một tập hợp các cấu trúc nguyên thủy độc lập có thể được kết hợp khi cần thiết để diễn đạt một chương trình. Các tính năng là trực giao nếu không có hạn chế về cách chúng có thể được kết hợp

Example : non-orthogonality

PASCAL: các hàm không thể trả về các kiểu có cấu trúc. Ngôn ngữ chức năng có tính trực giao cao.


0

Ý tưởng cơ bản của tính trực giao là những thứ không liên quan về mặt khái niệm không nên liên quan đến hệ thống. Các phần của kiến ​​trúc thực sự không liên quan gì đến phần khác, chẳng hạn như cơ sở dữ liệu và giao diện người dùng, không cần phải thay đổi cùng nhau. Thay đổi cái này không nên gây ra sự thay đổi cho cái khác.


-5

Kiểm tra tính trực giao của ma trận:

Tính trực giao cũng có thể liên quan đến ma trận,

Matrix *(transpose of matrix)= identity matrix. 

Nhấp vào liên kết bên dưới để xem video YouTube về Tính trực giao.
https://youtu.be/tNekLaxnfW8


Câu hỏi rõ ràng là về lập trình.
aggieol
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.