---
# System prepended metadata

title: 軟體面試常見問題
tags: [後端面試]

---

# 軟體面試常見問題

### 1. 什麼是MVC ?
#### 介紹
MVC 是一種軟體開發架構，它將應用程序分為三個主要組件：模型（Model）、視圖（View）和控制器（Controller）。每個組件都有不同的職責，這有助於維護代碼的可讀性和可維護性。以下是對 MVC 架構的詳細解釋：

1. **模型（Model）**：模型代表應用程序的數據和業務邏輯。它負責處理數據的存儲、檢索、驗證和計算。模型通常不處理用戶界面，而是專注於處理數據。

2. **視圖（View）**：視圖是用戶界面的呈現部分。它負責將數據可視化並呈現給用戶。視圖通常不包含業務邏輯，只是展示數據。

3. **控制器（Controller）**：控制器充當模型和視圖之間的中間層。它接受用戶輸入，並根據輸入執行相應的操作。控制器負責更新模型的狀態並通知視圖更新。

#### **MVC 的優點**：
- 分離關注點：MVC 允許分離應用程序的不同方面，使代碼更易於維護和測試。
- 可重用性：模型、視圖和控制器可以在多個應用程序中重複使用，提高了代碼的可重用性。
- 平行開發：開發人員可以同時工作於模型、視圖和控制器的不同部分，而不會相互干擾。

#### **MVC 的缺點**：
- 複雜性：對於簡單的應用程序，MVC 可能會顯得過於複雜，增加了開發成本和時間。
- 學習曲線：初學者可能需要一些時間來理解和適應 MVC 的概念和架構。

#### MVC 範例
```javascript=
// Model
class Book {
    constructor(title, author) {
        this.title = title;
        this.author = author;
    }
}

// View
function updateBookView(book) {
    console.log(`Title: ${book.title}, Author: ${book.author}`);
}

// Controller
class BookController {
    constructor(model, view) {
        this.model = model;
        this.view = view;
    }

    changeBookTitle(newTitle) {
        this.model.title = newTitle;
        this.view(this.model);
    }
}

// 使用 MVC
const book = new Book("1984", "George Orwell");
const controller = new BookController(book, updateBookView);
controller.changeBookTitle("Animal Farm");

```
### 2. 什麼是MVVM ?
> 簡單來說，view 有一個 viewmodel，並訂閱viewmodel data changed 的event，這樣只要view 透過viewmodel改變資料，就會出發event 讓view進行修改
---以上內容待確認---
#### 定義
MVVM 是一種軟體架構模式，特別適用於構建用戶界面。它由三部分組成：
- **Model（模型）**：代表應用數據和業務邏輯。
- **View（視圖）**：用於展示用戶界面。
- **ViewModel（視圖模型）**：作為視圖和模型之間的中介，負責處理視圖的邏輯和數據綁定。

#### 缺點
1. **複雜性**：對於簡單的應用程序來說，MVVM 可能會增加不必要的複雜性。
2. **學習曲線**：對於初學者來說，理解和有效地使用 MVVM 可能有一定難度。
3. **性能考量**：在某些情況下，尤其是數據綁定特別多的情況下，可能會影響性能。
4. **過度抽象**：過度使用 MVVM 可能會導致代碼過於抽象，難以追蹤和維護。

#### 程式範例
這裡提供一個簡單的 MVVM 實現範例，使用 JavaScript：

```javascript=
class Model {
    constructor() {
        this.data = "Hello World";
    }
}

class ViewModel {
    constructor(model) {
        this.model = model;
        this.view = null;
    }

    bindView(view) {
        this.view = view;
        this.view.display(this.model.data);
    }

    updateModel(data) {
        this.model.data = data;
        this.view.display(this.model.data);
    }
}

class View {
    display(data) {
        console.log(`View is displaying: ${data}`);
    }
}

// 使用示例
const model = new Model();
const viewModel = new ViewModel(model);
const view = new View();

viewModel.bindView(view);
viewModel.updateModel("Hello MVVM");
```

這個範例中，`Model` 保存數據，`ViewModel` 負責協調 `Model` 和 `View`，`View` 則展示數據。當 `ViewModel` 收到更新模型的請求時，它會更新 `Model`，然後通知 `View` 更新顯示。這就是 MVVM 中數據綁定

和自動更新的基本概念。

#### 常見面試問題及解答

1. **問題**：MVVM 如何實現數據綁定？
   - **解答**：MVVM 利用 ViewModel 來實現數據和視圖之間的自動同步。當模型數據發生變化時，ViewModel 會更新視圖，同時視圖的變化也會自動反映到模型上。

2. **問題**：MVVM 和 MVC 有什麼不同？
   - **解答**：MVVM 引入了 ViewModel，這個組件允許自動數據綁定和更少的代碼依賴，而 MVC 需要控制器來更新視圖，且視圖和模型之間通常有更直接的交互。

3. **問題**：MVVM 最適合哪種類型的應用程序？
   - **解答**：MVVM 特別適合需要豐富和動態用戶界面的單頁應用程序（SPA），如使用 Angular、Vue.js 或 Knockout.js 等現代 JavaScript 框架的應用。

### 3. MVC vs. MVVM ?
MVC 的controler 需要知道view，viewmodel可以不用知道view，讓view通過訂閱來完成畫面更新

| 比較項目 | MVC（模型-視圖-控制器） | MVVM（模型-視圖-視圖模型） |
|--------|---------------------|----------------------|
| **核心組成** | 模型（Model）、視圖（View）、控制器（Controller） | 模型（Model）、視圖（View）、視圖模型（ViewModel） |
| **數據處理** | 控制器負責業務邏輯和數據處理 | 業務邏輯和數據處理主要在視圖模型中處理 |
| **用戶界面更新** | 需要顯式更新視圖 | 支持自動更新視圖（通過數據綁定） |
| **數據綁定** | 通常需要手動設置和更新 | 支持雙向數據綁定 |
| **視圖和模型的關聯** | 控制器作為中介，連接視圖和模型 | 通過視圖模型直接與視圖綁定，減少了對模型的直接依賴 |
| **適用場景** | 簡單到中等複雜度的應用，需要明確分離各層次 | 複雜的用戶界面和數據驅動的應用，需要自動化的數據綁定和更新 |
| **複雜性** | 相對簡單和直觀 | 需要對數據綁定和視圖模型有一定了解，複雜度較高 |

這個表格總結了 MVC 和 MVVM 兩種架構的主要差異，包括它們的核心組成、數據處理方式、用戶界面更新機制、數據綁定特性以及適用場景和複雜性。這有助於更好地理解這兩種架構模式的特點和適用場景。

### 4. 什麼是OOP?
物件導向程式設計（Object-Oriented Programming, OOP）是一種程式設計範式，它使用「物件」（Objects）來設計應用程序和電腦程式。物件導向程式設計的核心概念包括類別（Class）、物件（Object）、繼承（Inheritance）、封裝（Encapsulation）、多型（Polymorphism）和抽象（Abstraction）。

以下是一個簡單的 C# 範例來說明 OOP 的概念：

```csharp=
// 定義一個類別（Class）
// 抽象類別
public abstract class Animal
{
    // 屬性
    public string Name { get; set; }

    // 抽象方法
    public abstract void Speak();
}

// 繼承抽象類別的具體類別
public class Dog : Animal
{
    // 覆寫抽象方法
    public override void Speak()
    {
        Console.WriteLine(Name + " says: Woof!");
    }
}

public class Cat : Animal
{
    // 覆寫抽象方法
    public override void Speak()
    {
        Console.WriteLine(Name + " says: Meow!");
    }
}

public class Program
{
    public static void Main()
    {
        // 不能直接實例化抽象類別
        // Animal myAnimal = new Animal(); // 錯誤

        Dog myDog = new Dog { Name = "Spike" };
        myDog.Speak();  // 輸出: Spike says: Woof!

        Cat myCat = new Cat { Name = "Whiskers" };
        myCat.Speak();  // 輸出: Whiskers says: Meow!
    }
}

```

在這個範例中，Animal 是一個抽象類別，它定義了一個抽象方法 Speak。Dog 和 Cat 是從 Animal 繼承而來的具體類別，它們分別覆寫了 Speak 方法以展現多型。我們不能直接實例化抽象類別 Animal，但可以通過其子類別來創建物件並調用方法。

#### 常見 OOP 面試問題：

1. **請解釋物件導向程式設計中的封裝（Encapsulation）。**
   - 解答：封裝是 OOP 的一個核心概念，它指的是將資料（屬性）和行為（方法）組合成一個單位，並限制對這些資料的直接訪問。這通常通過使用存取修飾符（如 private、protected、public）來實現。

2. **什麼是繼承（Inheritance）？**
   - 解答：繼承是 OOP 中的一個機制，它允許一個類別（子類別）繼承另一個類別（父類別）的屬性和方法。繼承支持代碼重用，並建立了類別之間的關係。

3. **多型（Polymorphism）在 OOP 中是如何工作的？**
   - 解答：多型是 OOP 的另一個核心概念，它指的是同一操作作用於不同的物件時，可以有不同的行為。在程式設計中，這通常通過方法覆寫（Overriding）和方法重載（Overloading）來實現。

4. **什麼是抽象（Abstraction）？**
   - 解答：抽象是將複雜性隱藏，並只向用戶顯示必要的功能。在 OOP 中，這通常通過創建抽象類別和介面來實現，它們定義了子類別應遵循的結構和行為。

5. **如何在您的程式設計中實現 OOP 原則？**
   - 解答：這需要分析具體情境，但一般來說，您應該識別應用中的不同實體，為它們創建類別，並通過繼承、封裝、多型和抽象來組織代碼。您還應該考慮使用設計模式來解決常見問題。

這些問題和答案旨在幫助您準備面對物件導向程式設計相關的面試。在實際的面試中，您可能還需要結合具體的程式設計語言來回答這些問題。

### 5. 什麼是byte bit?
- **位元（bit）**：位元是計算機中的最小單位，表示二進位中的0或1。 它是資料的最基本的表示方式，通常用於表示開關狀態或傳輸訊息的最小單元。

- **字節（byte）**：字節是資料的基本單位，通常由8個位元組成。 它是電腦中常用的資料儲存和傳輸單位，用於表示字元、數字和其他資訊。 在電腦程式設計和儲存中，位元組是常見的資料單元，通常用來表示一個字元或8位元二進位資料。
### 6. 什麼是Data types?

| 數據類型          | byte |
| ----------------- | ------ |
| short             | 2      |
| long              | 8      |
| float             | 4      |
| double            | 8      |
| int               | 4      |
| char              | 1      |
| unsigned          | 4      |
| unsigned int      | 4      |
| unsigned char     | 1      |
| pointer           | 8      |



